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()(vagyP/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 asignal()-t.signal()(vagyV/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)