Sobes.tech
Junior — Middle

Puteți explica principiul de funcționare al semaforului în programarea multi-thread?

sobes.tech AI

Răspuns de la AI

Un semafor este un mecanism de sincronizare în programarea multi-thread care controlează accesul la o resursă partajată. Conține un contor care indică câte fire pot accesa simultan resursa.

Principiul de funcționare:

  • Inițial, contorul semaforului este setat la un număr egal cu numărul de resurse disponibile.
  • Când un fir dorește să acceseze, apelează operațiunea "wait" (sau "acquire"), care scade contorul cu 1.
  • Dacă contorul devine mai mic decât zero, firul este blocat și așteaptă până când alt fir eliberează resursa.
  • Când un fir eliberează resursa, apelează operațiunea "signal" (sau "release"), care crește contorul cu 1 și deblochează firele în așteptare.

Exemplu în Swift folosind DispatchSemaphore:

let semaphore = DispatchSemaphore(value: 2) // permitem 2 fire simultan

DispatchQueue.global().async {
    semaphore.wait() // încercăm să accesăm
    print("Firul a început să lucreze")
    sleep(2) // simulare de lucru
    print("Firul a terminat de lucrat")
    semaphore.signal() // eliberăm resursa
}

Astfel, semaforul ajută la limitarea numărului de fire care lucrează simultan cu o resursă partajată, prevenind condițiile de cursă și asigurând integritatea datelor.