Junior — Middle
Meg tudná magyarázni a szeminátor működési elvét a több szálas programozásban?
sobes.tech MI
Válasz az MI-től
A szemafor egy szinkronizációs mechanizmus a több szálas programozásban, amely ellenőrzi a közös erőforráshoz való hozzáférést. Tartalmaz egy számlálót, amely megmutatja, hány szál férhet hozzá egyidejűleg az erőforráshoz.
Működési elv:
- Kezdetben a szemafor számlálóját a rendelkezésre álló erőforrások számára állítják.
- Amikor egy szál hozzáférést szeretne, meghívja a "wait" (vagy "acquire") műveletet, ami csökkenti a számlálót 1-gyel.
- Ha a számláló kisebb lesz nullánál, a szál blokkolódik, és vár, amíg egy másik szál felszabadítja az erőforrást.
- Amikor egy szál felszabadítja az erőforrást, meghívja a "signal" (vagy "release") műveletet, ami növeli a számlálót 1-gyel, és feloldja a várakozó szálakat.
Swift példában DispatchSemaphore használatával:
let semaphore = DispatchSemaphore(value: 2) // lehetővé teszi, hogy egyszerre 2 szál fusson
DispatchQueue.global().async {
semaphore.wait() // hozzáférés próbálása
print("A szál munkába kezdett")
sleep(2) // munka szimuláció
print("A szál befejezte a munkát")
semaphore.signal() // erőforrás felszabadítása
}
Így a szemafor segít korlátozni a párhuzamosan működő szálak számát egy közös erőforrással, megelőzve a versenyhelyzeteket és biztosítva az adatok integritását.