Megosztás a következőn keresztül:


Több szál végrehajtásának szinkronizálása

A versenyfeltételek és holtpontok elkerülése érdekében több szálon kell szinkronizálni a hozzáférést a megosztott erőforrásokhoz. Szinkronizálásra is szükség van annak biztosításához, hogy az egymástól függő kód a megfelelő sorrendben legyen végrehajtva.

Számos olyan objektum van, amelynek fogópontjai több szál szinkronizálására használhatók. Ezek az objektumok a következők:

  • Konzol bemeneti pufferei
  • Események
  • Mutexes
  • Folyamatok
  • Semaphorok
  • Szálak
  • Időzítők

Az egyes objektumok állapota vagy jelezve van, vagy nincs jelezve. Ha a várakozási függvényekegyikének hívásában ezen objektumok bármelyikének leírót ad meg, a hívószál végrehajtása le lesz tiltva, amíg a megadott objektum állapota nem lesz jelezve.

Néhány ilyen objektum akkor hasznos, ha blokkol egy szálat, amíg valamilyen esemény nem következik be. Például a konzol bemeneti pufferfogantyúja akkor lesz jelezve, ha olvasatlan bemenet van, például billentyűleütés vagy egérgomb kattintása. A folyamat- és szálkezelők akkor vannak jelezve, amikor a folyamat vagy a szál leáll. Ez lehetővé teszi például, hogy egy folyamat gyermekfolyamatot hozzon létre, majd letiltsa a saját végrehajtását, amíg az új folyamat le nem fejeződik.

Más objektumok hasznosak a megosztott erőforrások egyidejű hozzáféréssel szembeni védelmében. Például több szál is rendelkezhet fogópontokkal egy mutex objektumhoz. A megosztott erőforrás elérése előtt a szálaknak meg kell hívniuk az egyik várakozási függvényt, hogy a mutex állapota jelezve legyen. Amikor a mutex jelzést ad, csak egy várakozó szál lesz felszabadítva az erőforrás eléréséhez. A mutex állapota azonnal visszaáll nem jelzettre, így minden más várakozó szál blokkolva marad. Amikor a szál befejezi az erőforrás használatát, a mutex állapotát úgy kell beállítania, hogy jelezze, más szálak hozzáférhetnek az erőforráshoz.

Egyetlen folyamat szálai esetében a kritikus szakaszú objektumok hatékonyabb szinkronizálási módot biztosítanak, mint a mutexek. A kritikus szakaszokat a rendszer a mutexhez hasonlóan használja, hogy egyszerre egy szálat engedélyezhessen a védett erőforrás használatához. A szálak az EnterCriticalSection függvénnyel kérhetik egy kritikus szakasz tulajdonjogát. Ha már egy másik szál tulajdonában van, a rendszer letiltja a kérési szálat. A szál a TryEnterCriticalSection függvénnyel kérheti egy kritikus szakasz kezelését anélkül, hogy blokkolna, ha nem sikerül megszerezni a kritikus szakaszt. Miután megkapta a tulajdonjogot, a szál szabadon használhatja a védett erőforrást. A folyamat többi szálának végrehajtása nem érintett, kivéve ha azok ugyanabba a kritikus szakaszba próbálnak belépni.

A WaitForInputIdle függvény megvárakoztat egy szálat, amíg egy specifikált folyamat elindul és felhasználói bemenetre várakozik, miközben nincs beérkező bemenet. A WaitForInputIdle meghívása hasznos lehet a szülő- és gyermekfolyamatok szinkronizálásához, mivel CreateProcess a gyermekfolyamat inicializálásának befejezése nélkül tér vissza.

További információ: Szinkronizálás.