Sdílet prostřednictvím


Mutex – objekty

objekt mutex je synchronizační objekt, jehož stav je nastaven tak, aby signalizoval, když není vlastníkem žádného vlákna, a není přiřazen při jeho vlastnictví. Pouze jedno vlákno může vlastnit objekt mutex, jehož název pochází ze skutečnosti, že je užitečné koordinovat vzájemně se vylučující přístup ke sdílenému prostředku. Pokud například chcete zabránit zápisu dvou vláken do sdílené paměti současně, každé vlákno čeká na vlastnictví objektu mutex před spuštěním kódu, který přistupuje k paměti. Po zápisu do sdílené paměti vlákno uvolní objekt mutex.

Vlákno používá k vytvoření objektu mutex funkci CreateMutex nebo CreateMutexEx. Vytvoření vlákna může požadovat okamžité vlastnictví objektu mutex a může také zadat název objektu mutex. Může také vytvořit nepojmenovaný mutex. Další informace o názvech objektů mutex, event, semaphore a časovače naleznete v tématu Synchronizace interprocesů.

Vlákna v jiných procesech mohou otevřít popisovač existující pojmenovaný mutex objekt zadáním jeho názvu ve volání OpenMutex funkce. Pokud chcete předat popisovač jinému procesu bez názvu mutex, použijte funkci DuplicateHandle nebo dědičnost popisovače nadřazeného-podřízeného objektu.

Jakékoli vlákno s popisovačem objektu mutex může použít jednu z čekací funkce požadovat vlastnictví objektu mutex. Pokud objekt mutex vlastní jiné vlákno, funkce čekání blokuje požadované vlákno, dokud vlastnící vlákno uvolní objekt mutex pomocí funkce ReleaseMutex. Návratová hodnota funkce čekání označuje, zda funkce vrátila z nějakého důvodu jinou než stav mtex, který je nastaven na signalizován.

Pokud na mutex čeká více než jedno vlákno, vybere se čekající vlákno. Nepředpokládejte pořadí fiFO (first-in). Externí události, jako jsou apcs v režimu jádra, můžou změnit pořadí čekání.

Jakmile vlákno získá vlastnictví mutex, může určit stejný mutex při opakovaných voláních wait-functions bez blokování jeho spuštění. Tím zabráníte zablokování vlákna při čekání na mutex, který už vlastní. Aby bylo za takových okolností uvolněno jeho vlastnictví, musí vlákno zavolat ReleaseMutex jednou pro každou dobu, kdy mutex splnil podmínky čekací funkce.

Pokud se vlákno ukončí bez uvolnění jeho vlastnictví objektu mutex, objekt mutex se považuje za opuštěný. Čekající vlákno může získat vlastnictví opuštěného objektu mutex, ale funkce čekání vrátí WAIT_ABANDONED indikuje, že objekt mutex je opuštěný. Opuštěný objekt mutex označuje, že došlo k chybě a že jakýkoli sdílený prostředek chráněný objektem mutex je v nedefinovaném stavu. Pokud vlákno pokračuje, jako by objekt mutex nebyl opuštěný, už se nepovažuje za opuštěné po uvolnění vlastnictví vlákna. Tím se obnoví normální chování, pokud je následně v čekací funkci zadán popisovač objektu mutex.

Všimněte si, že kritické objekty oddílu poskytují synchronizaci podobnou té, kterou poskytují objekty mutex, s tím rozdílem, že kritické objekty oddílu mohou být používány pouze vlákny jednoho procesu.

použití objektů Mutex