Middle
Šta je semafor u kontekstu programiranja?
sobes.tech АИ
Одговор од АИ
Semafor je primitivan mehanizam za sinhronizaciju niti koji upravlja pristupom ograničenom resursu. On održava celobrojni brojač.
Osnovne operacije:
wait()(iliP/acquire) : Smanjuje brojač za 1. Ako brojač postane negativan, nit se blokira dok druga nit ne izvršisignal().signal()(iliV/release) : Povećava brojač za 1. Ako postoje blokirane niti, jedna od njih će biti odblokirana.
Tipovi semafora:
- Binarni semafor (mutex) : Brojač uzima vrednosti 0 ili 1. Koristi se za obezbeđivanje međusobnog isključivanja – samo jedna nit može istovremeno da pristupi resursu.
- Brojački semafor : Brojač može da uzima vrednosti od 0 do N. Koristi se za upravljanje pristupom ka bazenu resursa sa ograničenim brojem dostupnih elemenata.
Primer u Swift za ograničavanje broja zadataka koji se mogu istovremeno izvršavati:
// Kreiranje semafora koji dozvoljava do 3 istovremena pristupa
let semaphore = DispatchSemaphore(value: 3)
DispatchQueue.global().async {
// Zadatak 1
semaphore.wait() // Smanjuje brojač, blokira ako je > 3 zadatka u toku
print("Zadatak 1 je počeo")
Thread.sleep(forTimeInterval: 2) // Simulacija rada
print("Zadatak 1 je završio")
semaphore.signal() // Povećava brojač, otključava čekajuće zadatke
}
DispatchQueue.global().async {
// Zadatak 2
semaphore.wait()
print("Zadatak 2 je počeo")
Thread.sleep(forTimeInterval: 3)
print("Zadatak 2 je završio")
semaphore.signal()
}
DispatchQueue.global().async {
// Zadatak 3
semaphore.wait()
print("Zadatak 3 je počeo")
Thread.sleep(forTimeInterval: 1)
print("Zadatak 3 je završio")
semaphore.signal()
}
DispatchQueue.global().async {
// Zadatak 4 (će čekati dok se ne oslobodi mesto)
semaphore.wait()
print("Zadatak 4 je počeo")
Thread.sleep(forTimeInterval: 2)
print("Zadatak 4 je završio")
semaphore.signal()
}
// Čekamo da se sve zadaci završe
// U pravom kodu koristite pouzdanije mehanizme za čekanje
Thread.sleep(forTimeInterval: 5)