Mutex-objektumok
A mutex objektum egy olyan szinkronizálási objektum, amelynek állapota akkor van beállítva, hogy jelezve legyen, ha nem egy szál tulajdonában van, és nem lesz aláírva, amikor a tulajdonosa. Egyszerre csak egy szál birtokolhat egy mutex objektumot, amelynek a neve abból a tényből ered, hogy hasznos a megosztott erőforrások kölcsönösen kizárólagos hozzáférésének koordinálásában. Ha például meg szeretné akadályozni, hogy két szál egyszerre írjon a megosztott memóriába, minden szál megvárja a mutex objektum tulajdonjogát, mielőtt végrehajtja a memóriához hozzáférő kódot. Miután a megosztott memóriába írt, a szál felszabadítja a mutex objektumot.
A szál a CreateMutex vagy CreateMutexEx függvénnyel hoz létre egy mutex objektumot. A létrehozási szál kérheti a mutex objektum azonnali tulajdonjogát, és megadhatja a mutex objektum nevét is. Névtelen mutexet is létrehozhat. További információ a mutex-, esemény-, szemaphore- és időzítőobjektumok nevéről: folyamatközi szinkronizálási.
Más folyamatok szálai megnyithatnak egy leírót egy meglévő nevesített mutex objektum számára, ha megadják a nevét az OpenMutex függvény hívásában. Ha egy fogópontot egy meg nem nevezett mutexnek szeretne átadni egy másik folyamatnak, használja a DuplicateHandle függvényt vagy a szülő-gyermek fogópont öröklését.
A mutex objektumhoz fogóponttal rendelkező szálak a várakozási függvények egyikével kérhetik a mutex objektum tulajdonjogát. Ha a mutex objektum egy másik szál tulajdonában van, a várakozási függvény blokkolja a kérelmező szálat, amíg a tulajdonos szál fel nem oldja a mutex objektumot a ReleaseMutex függvénnyel. A várakozási függvény visszatérési értéke azt jelzi, hogy a függvény a jelre beállított mutex állapotától eltérő okból lett-e visszaadva.
Ha egynél több szál várakozik egy szálon, a rendszer kiválaszt egy várakozó szálat. Ne feltételezze az első, első utáni (FIFO) sorrendet. A külső események, például a kernel módú API-k módosíthatják a várakozási sorrendet.
Miután egy szál megszerezte a mutex tulajdonjogát, ugyanazt a mutexet megadhatja a várakozási függvények ismételt hívásaiban anélkül, hogy letiltotta volna a végrehajtást. Ez megakadályozza, hogy egy szál holtpontra ássa magát, miközben a már birtokolt mutexre vár. Ha ilyen körülmények között szeretné felszabadítani a tulajdonjogát, a szálnak minden alkalommal egyszer meg kell hívnia ReleaseMutex minden alkalommal, amikor a mutex megfelel a várakozási függvény feltételeinek.
Ha egy szál egy mutex objektum tulajdonjogának felszabadítása nélkül megszűnik, a mutex objektum elhagyatlannak minősül. A várakozó szál megszerezheti egy elhagyott mutex objektum tulajdonjogát, de a várakozási függvény WAIT_ABANDONED visszaadja, hogy a mutex objektum elhagyva van. Egy elhagyott mutex objektum azt jelzi, hogy hiba történt, és hogy a mutex objektum által védett megosztott erőforrások nem definiált állapotban vannak. Ha a szál úgy folytatódik, mintha a mutex objektum nem lett volna elhagyva, akkor többé nem tekinthető elhagyatottnak, miután a szál felengedi a tulajdonjogát. Ez visszaállítja a normál viselkedést, ha a rendszer ezt követően egy várakozási függvényben megadja a mutex objektumhoz tartozó leírót.
Vegye figyelembe, hogy kritikus szakaszobjektumok a mutex objektumok által biztosítotthoz hasonló szinkronizálást biztosítanak, azzal a kivétellel, hogy a kritikus szakaszobjektumokat csak egyetlen folyamat szálai használhatják.
Kapcsolódó témakörök