Freigeben über


Mutex-Objekte

Ein Mutex-Objekt ist ein Synchronisierungsobjekt, dessen Zustand auf signalisiert festgelegt ist, wenn es sich nicht im Besitz eines Threads befindet, und nicht signalisiert, wenn es sich im Besitz befindet. Nur jeweils ein Thread kann besitzer eines Mutex-Objekts sein, dessen Name sich aus der Tatsache ergibt, 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 den freigegebenen Arbeitsspeicher schreiben, wartet jeder Thread auf den Besitz eines Mutex-Objekts, bevor der Code ausgeführt wird, der auf den Arbeitsspeicher 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 erstellenden Thread kann den sofortigen Besitz des Mutex-Objekts anfordern und auch einen Namen für das Mutex-Objekt angeben. Es 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 sie seinen Namen in einem Aufruf der OpenMutex-Funktion angeben. Um ein Handle an einen unbenannten Mutex an einen anderen Prozess zu übergeben, verwenden Sie die Duplikathandle-Funktion oder die Vererbung des über- und untergeordneten Handles.

Jeder Thread mit einem Handle für ein Mutex-Objekt kann eine der Wartefunktionen 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 besitzende Thread das Mutex-Objekt mithilfe der ReleaseMutex-Funktion freigibt. Der Rückgabewert der Wait-Funktion gibt an, ob die Funktion aus einem anderen Grund als dem Status des Mutex zurückgegeben wurde, der auf signalisiert festgelegt wird.

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

Nachdem ein Thread den Besitz eines Mutex erhalten hat, kann er den gleichen Mutex in wiederholten Aufrufen der Wartefunktionen angeben, ohne dessen Ausführung zu blockieren. Dadurch wird verhindert, dass ein Thread selbst deadlockt, während er auf einen Mutex wartet, den er bereits besitzt. Um seinen Besitz unter solchen Umständen freizugeben, muss der Thread ReleaseMutex einmal für jedes Mal aufrufen, wenn der Mutex die Bedingungen einer Wartefunktion erfüllt.

Wenn ein Thread beendet wird, ohne den Besitz eines Mutex-Objekts freizugeben, gilt das Mutex-Objekt als aufgegeben. Ein wartenden Thread kann den Besitz eines verlassenen Mutex-Objekts erwerben, aber die Wartefunktion gibt WAIT_ABANDONED zurück, um anzugeben, dass das Mutex-Objekt aufgegeben wurde. Ein verlassenes Mutex-Objekt gibt an, dass ein Fehler aufgetreten ist und dass sich alle freigegebenen Ressourcen, die durch das Mutex-Objekt geschützt werden, in einem undefinierten Zustand befinden. Wenn der Thread so fortgesetzt wird, als ob das Mutex-Objekt nicht verlassen wurde, gilt es nicht mehr als aufgegeben, nachdem der Thread seinen Besitz freigegeben hat. Dadurch wird das normale Verhalten wiederhergestellt, wenn anschließend ein Handle für das Mutex-Objekt in einer Wartefunktion angegeben wird.

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

Verwenden von Mutex-Objekten