Sobes.tech
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() (ili P / acquire) : Smanjuje brojač za 1. Ako brojač postane negativan, nit se blokira dok druga nit ne izvrši signal().
  • signal() (ili V / 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)