Middle
Ce este un semafor în contextul programării?
sobes.tech AI
Răspuns de la AI
Semaforul este o primitive de sincronizare a firelor care controlează accesul la o resursă limitată. Menține un contor întreg.
Operații principale:
wait()(sauP/acquire) : Scade contorul cu 1. Dacă contorul devine negativ, firul de execuție se blochează până când altul executăsignal().signal()(sauV/release) : Crește contorul cu 1. Dacă există fire blocate, unul dintre ele va fi deblocat.
Tipuri de semafoare:
- Semafor binar (mutex) : Contorul ia valorile 0 sau 1. Folosit pentru asigurarea excluziunii reciproce – doar un fir de execuție poate accesa resursa simultan.
- Semafor numărător : Contorul poate lua valori de la 0 la N. Folosit pentru gestionarea accesului la un pool de resurse cu un număr limitat de elemente disponibile.
Exemplu de utilizare în Swift pentru limitarea numărului de sarcini care pot fi executate simultan:
// Crearea unui semafor care permite până la 3 accesări simultane
let semaphore = DispatchSemaphore(value: 3)
DispatchQueue.global().async {
// Sarcina 1
semaphore.wait() // Scade contorul, blochează dacă > 3 sarcini rulează
print("Sarcina 1 a început")
Thread.sleep(forTimeInterval: 2) // Simulare de lucru
print("Sarcina 1 s-a terminat")
semaphore.signal() // Crește contorul, deblochează sarcinile în așteptare
}
DispatchQueue.global().async {
// Sarcina 2
semaphore.wait()
print("Sarcina 2 a început")
Thread.sleep(forTimeInterval: 3)
print("Sarcina 2 s-a terminat")
semaphore.signal()
}
DispatchQueue.global().async {
// Sarcina 3
semaphore.wait()
print("Sarcina 3 a început")
Thread.sleep(forTimeInterval: 1)
print("Sarcina 3 s-a terminat")
semaphore.signal()
}
DispatchQueue.global().async {
// Sarcina 4 (va aștepta până se eliberează un slot)
semaphore.wait()
print("Sarcina 4 a început")
Thread.sleep(forTimeInterval: 2)
print("Sarcina 4 s-a terminat")
semaphore.signal()
}
// Așteaptă finalizarea tuturor sarcinilor pentru demonstrație
// În codul real, folosiți mecanisme de așteptare mai fiabile
Thread.sleep(forTimeInterval: 5)