Freigeben über


Mutex-Objekte

Ein Mutex-Objekt ist ein Synchronisierungsobjekt, dessen Zustand auf signalisiert wird, wenn es sich nicht im Besitz eines Threads befindet und nicht signalisiert wird, wenn es im Besitz ist. Nur jeweils ein Thread kann ein Mutex-Objekt besitzen, dessen Name aus der Tatsache stammt, dass es nützlich ist, den gegenseitig ausschließenden Zugriff auf eine freigegebene Ressource zu koordinieren. Um beispielsweise zu verhindern, dass zwei Threads gleichzeitig in gemeinsam genutzten Arbeitsspeicher schreiben, wartet jeder Thread auf den Besitz eines Mutex-Objekts, bevor der Code ausgeführt wird, der auf den Speicher zugreift. Nach dem Schreiben in den freigegebenen Speicher gibt der Thread das Mutex-Objekt frei.

Ein Thread verwendet die CreateMutex oder CreateMutexEx--Funktion, um ein Mutex-Objekt zu erstellen. Der Erstellungsthread kann den sofortigen Besitz des Mutex-Objekts anfordern und auch einen Namen für das Mutex-Objekt angeben. Sie kann auch einen unbenannten Mutex erstellen. Weitere Informationen zu Namen für Mutex-, Ereignis-, Semaphor- und Timerobjekte finden Sie unter Interprocess Synchronization.

Threads in anderen Prozessen können ein Handle für ein vorhandenes benanntes Mutex-Objekt öffnen, indem er seinen Namen in einem Aufruf der OpenMutex--Funktion angibt. Um ein Handle an einen unbenannten Mutex an einen anderen Prozess zu übergeben, verwenden Sie die DuplicateHandle--Funktion oder die Vererbung übergeordneter untergeordneter Elemente.

Jeder Thread mit einem Handle für ein Mutex-Objekt kann eine der Wait-Funktionen verwenden, um den Besitz des Mutex-Objekts anzufordern. Wenn das Mutex-Objekt einem anderen Thread gehört, blockiert die Wait-Funktion den anfordernden Thread, bis der besitzereigene Thread das Mutex-Objekt mithilfe der ReleaseMutex--Funktion loslässt. Der Rückgabewert der Wartefunktion gibt an, ob die zurückgegebene Funktion aus irgendeinem Anderen Grund als dem Zustand des mutex-Werts, der signalisiert wird, zurückgegeben wird.

Wenn mehr als ein Thread auf einen Mutex wartet, wird ein Wartethread ausgewählt. Gehen Sie nicht von einer First-In-First-Out-Reihenfolge (First-Out, FIFO) aus. Externe Ereignisse wie Kernelmodus-APCs können die Wartereihenfolge ändern.

Nachdem ein Thread den Besitz eines Mutex abgerufen hat, kann er den gleichen Mutex in wiederholten Aufrufen der Wait-Functions- angeben, ohne die Ausführung zu blockieren. Dadurch wird verhindert, dass ein Thread sich selbst blockiert, während er auf einen Mutex wartet, den er bereits besitzt. Um den Besitz unter solchen Umständen freizugeben, muss der Thread ReleaseMutex einmal aufrufen, wenn der Mutex die Bedingungen einer Wartefunktion erfüllt.

Wenn ein Thread beendet wird, ohne dessen Besitz eines Mutex-Objekts freizugeben, wird das Mutex-Objekt als abgebrochen betrachtet. Ein Wartethread kann den Besitz eines verlassenen Mutex-Objekts erwerben, die Wartefunktion gibt jedoch WAIT_ABANDONED zurück, um anzugeben, dass das Mutex-Objekt abgebrochen wird. Ein verlassenes Mutex-Objekt gibt an, dass ein Fehler aufgetreten ist und dass alle freigegebenen Ressourcen, die durch das Mutex-Objekt geschützt werden, in einem nicht definierten Zustand sind. Wenn der Thread fortgesetzt wird, als wäre das Mutex-Objekt nicht abgebrochen worden, wird er nach dem Freigeben des Besitzes des Threads nicht mehr als abgebrochen betrachtet. Dadurch wird das normale Verhalten wiederhergestellt, wenn ein Handle für das Mutex-Objekt anschließend in einer Wartefunktion angegeben wird.

Beachten Sie, dass kritische Abschnittsobjekte die Synchronisierung ähnlich der von Mutex-Objekten bereitgestellten bereitstellen, mit der Ausnahme, dass kritische Abschnittsobjekte nur von den Threads eines einzelnen Prozesses verwendet werden können.

Verwenden von Mutex-Objekten