Sobes.tech
Middle

Mis on semafor programmeerimise kontekstis?

sobes.tech AI

Vastus AI-lt

Semafor on sünkroniseerimise primitiiv, mis juhib voogude juurdepääsu piiratud ressursile. See hoiab kogu arvulise loenduri.

Põhitoimingud:

  • wait() (või P / acquire): vähendab loendurit 1-iga. Kui loendur muutub negatiivseks, blokeeritakse voog kuni teine voog täidab signal().
  • signal() (või V / release): suurendab loendurit 1-iga. Kui on blokeeritud vooge, üks neist vabastatakse.

Semafori tüübid:

  • Binaarne semafor (mutex): loendur võtab väärtused 0 või 1. Kasutatakse vastastikuse välistamise tagamiseks — ainult üks voog saab samaaegselt ressursile ligi.
  • Loendamise semafor: loendur võib võtta väärtusi 0 kuni N. Kasutatakse piiratud ressursside paki juurdepääsu haldamiseks.

Näide Swiftis, mis piirab samaaegselt töötavate ülesannete arvu:

// Semafori loomine, mis lubab kuni 3 samaaegset juurdepääsu
let semaphore = DispatchSemaphore(value: 3)

DispatchQueue.global().async {
    // Ülesanne 1
    semaphore.wait() // vähendab loendurit, blokeerib kui > 3 ülesannet töötavad
    print("Ülesanne 1 algas")
    Thread.sleep(forTimeInterval: 2) // töö imiteerimine
    print("Ülesanne 1 lõpetas")
    semaphore.signal() // suurendab loendurit, vabastab ootavad ülesanded
}

DispatchQueue.global().async {
    // Ülesanne 2
    semaphore.wait()
    print("Ülesanne 2 algas")
    Thread.sleep(forTimeInterval: 3)
    print("Ülesanne 2 lõpetas")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Ülesanne 3
    semaphore.wait()
    print("Ülesanne 3 algas")
    Thread.sleep(forTimeInterval: 1)
    print("Ülesanne 3 lõpetas")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Ülesanne 4 (ootab, kuni vaba slot)
    semaphore.wait()
    print("Ülesanne 4 algas")
    Thread.sleep(forTimeInterval: 2)
    print("Ülesanne 4 lõpetas")
    semaphore.signal()
}

// Ootame kõigi ülesannete lõpetamist — näitamiseks
// Kasutage usaldusväärsemaid ootamise mehhanisme
Thread.sleep(forTimeInterval: 5)