Recimo, da imam OneWire scan naprav operacijo, in ker hočem, da sem thread safe, bom z mutexom zaščitil API:
Spodnji primer zaklene dostop z mutexom, potem pa začne scan. V scanu je potrebno poslati reset pulse, pa potem ukaz za iskanje senzorja, etc.
Če je DS18B20 najdem, hočem takoj poslati 12-bitni način, kar pomeni ponovem reset pulse, etc.
- Koda: Izberi vse
//Pseudo-koda
Mutex_lock();
start_search() //pošlji reset pulse na 1-wire
while ((rom_id = search_next()) > 0) {
if is_ds18b20(rom_id))
set_12-bit_resolution(rom_id);
}
Mutex_unlock();
Medtem sem pa tudi reset funkcijo naredil thread safe, ki zgleda nekako tako:
- Koda: Izberi vse
reset(void) {
Mutex_lock();
send_reset_pulse();
Mutex_unlock();
return success();
}
Če sedaj malo pomislimo, je jasno, da ko je mutex že zaklenjen za search, je znotraj le-tega klic na reset pulse, ki tudi naredi mutex lock, kar ima lahko za posledico 2 stvari:
- Dead-Lock, če mutex ni rekurziven
- Normalno delovanje, če je mutex rekurziven.
Kakšna je vaša praksa glede tega? Uporabljate izključno rekurzivne mutexe, ali bi napisali v takšnem primeru 2 reset funkciji, ena, ki pričakuje, da je bil mutex zaklenjen nekje zunaj in ena, ki to naredi sama? Kaj, če je takšnih podobnih funkcij 100? Bi dodali vsaki funkciji parameter "lock_mutex"?
Edit: Govorim o izključno C-ju.