Jaké jsou základní rozdíly mezi zámky otáčení a semafory v akci?
Přijatá odpověď:
Oba spravují omezený zdroj. Nejprve popíšu rozdíl mezi binárním semaforem (mutex) a spin lockem.
Zámky otáčení provádějí rušné čekání – tj. stále běží smyčka:
while (try_acquire_resource ());
...
release();
Provádí velmi lehké zamykání/odemykání, ale pokud bude zamykací vlákno zabráněno jiným, které se pokusí získat přístup ke stejnému zdroji, druhé se jednoduše pokusí získat zdroj, dokud mu nedojdou kvanta CPU.
Na druhou stranu se mutex chová spíše jako:
if (!try_lock()) {
add_to_waiting_queue ();
wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();
Pokud se tedy vlákno pokusí získat blokovaný zdroj, bude pozastaveno, dokud pro něj nebude dostupné. Zamykání/odemykání je mnohem těžší, ale čekání je „zdarma“ a „spravedlivé“.
Semafor je zámek, který lze použít vícekrát (známý z inicializace) několikrát – například 3 vlákna mohou současně držet zdroj, ale ne více. Používá se například v problému producent/spotřebitel nebo obecně ve frontách:
P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)