Sobes.tech
Middle

Mi az a szemafor a programozás kontextusában?

sobes.tech MI

Válasz az MI-től

A szemafor egy primitív szálak szinkronizálására szolgáló eszköz, amely korlátozott erőforráshoz való hozzáférést kezel. Egész számú számlálót tart fenn.

Fő műveletek:

  • wait() (vagy P / acquire) : Csökkenti a számlálót 1-gyel. Ha a számláló negatív lesz, a szál blokkolódik, amíg egy másik végrehajtja a signal()-t.
  • signal() (vagy V / release) : Növeli a számlálót 1-gyel. Ha blokkolt szálak vannak, közülük egy feloldódik.

A szeminátor típusai:

  • Bináris szeminátor (mutex) : A számláló 0 vagy 1 értéket vehet fel. Csak egy szál férhet hozzá a forráshoz egyszerre.
  • Számláló szeminátor : A számláló 0-tól N-ig terjedő értékeket vehet fel. A korlátozott számú elérhető elemű erőforrás-készlethez való hozzáférést kezeli.

Példa Swift-ben a párhuzamos feladatok számának korlátozására:

// Egy szeminátor létrehozása, amely legfeljebb 3 párhuzamos hozzáférést engedélyez
let semaphore = DispatchSemaphore(value: 3)

DispatchQueue.global().async {
    // Feladat 1
    semaphore.wait() // Csökkenti a számlálót, blokkol, ha több mint 3 feladat fut
    print("Feladat 1 indult")
    Thread.sleep(forTimeInterval: 2) // Munka szimulálása
    print("Feladat 1 befejeződött")
    semaphore.signal() // Növeli a számlálót, feloldja a várakozó feladatokat
}

DispatchQueue.global().async {
    // Feladat 2
    semaphore.wait()
    print("Feladat 2 indult")
    Thread.sleep(forTimeInterval: 3)
    print("Feladat 2 befejeződött")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Feladat 3
    semaphore.wait()
    print("Feladat 3 indult")
    Thread.sleep(forTimeInterval: 1)
    print("Feladat 3 befejeződött")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Feladat 4 (várni fog, amíg szabad hely nem lesz)
    semaphore.wait()
    print("Feladat 4 indult")
    Thread.sleep(forTimeInterval: 2)
    print("Feladat 4 befejeződött")
    semaphore.signal()
}

// Várjuk meg, hogy minden feladat befejeződjön
// Reális kódban megbízhatóbb várakozási mechanizmusokat használjon
Thread.sleep(forTimeInterval: 5)