Sobes.tech
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() (sau P / acquire) : Scade contorul cu 1. Dacă contorul devine negativ, firul de execuție se blochează până când altul execută signal().
  • signal() (sau V / 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)