Oggetti Mutex

Un oggetto mutex è un oggetto di sincronizzazione il cui stato è impostato su segnalato quando non è di proprietà di alcun thread e non assegnato quando è di proprietà. Solo un thread alla volta può possedere un oggetto mutex, il cui nome deriva dal fatto che è utile per coordinare l'accesso reciproco esclusivo a una risorsa condivisa. Ad esempio, per impedire la scrittura di due thread nella memoria condivisa contemporaneamente, ogni thread attende la proprietà di un oggetto mutex prima di eseguire il codice che accede alla memoria. Dopo aver scritto nella memoria condivisa, il thread rilascia l'oggetto mutex.

Un thread usa la funzione CreateMutex o CreateMutexEx per creare un oggetto mutex. Il thread di creazione può richiedere la proprietà immediata dell'oggetto mutex e può anche specificare un nome per l'oggetto mutex. Può anche creare un mutex senza nome. Per altre informazioni sui nomi per gli oggetti mutex, evento, semaforo e timer, vedere Sincronizzazione interprocesso.

I thread in altri processi possono aprire un handle a un oggetto mutex denominato esistente specificando il nome in una chiamata alla funzione OpenMutex . Per passare un handle a un mutex senza nome a un altro processo, usare la funzione DuplicateHandle o l'ereditarietà dell'handle padre-figlio.

Qualsiasi thread con un handle a un oggetto mutex può usare una delle funzioni di attesa per richiedere la proprietà dell'oggetto mutex. Se l'oggetto mutex è di proprietà di un altro thread, la funzione wait blocca il thread di richiesta fino a quando il thread proprietario rilascia l'oggetto mutex usando la funzione ReleaseMutex . Il valore restituito della funzione di attesa indica se la funzione restituita per qualche motivo diverso dallo stato del mutex impostato su segnalato.

Se più thread sono in attesa su un mutex, viene selezionato un thread in attesa. Non presupporre un ordine FIFO (first-out) first-out. Gli eventi esterni, ad esempio le API in modalità kernel, possono modificare l'ordine di attesa.

Dopo che un thread ottiene la proprietà di un mutex, può specificare lo stesso mutex nelle chiamate ripetute alle funzioni di attesa senza bloccare l'esecuzione. Ciò impedisce a un thread di deadlock se stesso durante l'attesa di un mutex già proprietario. Per rilasciare la proprietà in tali circostanze, il thread deve chiamare ReleaseMutex una volta per ogni volta che il mutex ha soddisfatto le condizioni di una funzione di attesa.

Se un thread termina senza rilasciare la proprietà di un oggetto mutex, l'oggetto mutex viene considerato abbandonato. Un thread in attesa può acquisire la proprietà di un oggetto mutex abbandonato, ma la funzione di attesa restituirà WAIT_ABANDONED per indicare che l'oggetto mutex viene abbandonato. Un oggetto mutex abbandonato indica che si è verificato un errore e che qualsiasi risorsa condivisa protetta dall'oggetto mutex si trova in uno stato non definito. Se il thread procede come se l'oggetto mutex non fosse stato abbandonato, non viene più considerato abbandonato dopo che il thread rilascia la proprietà. Questo ripristina il comportamento normale se un handle all'oggetto mutex viene successivamente specificato in una funzione di attesa.

Si noti che gli oggetti della sezione critica forniscono la sincronizzazione simile a quella fornita dagli oggetti mutex, tranne che gli oggetti di sezione critica possono essere usati solo dai thread di un singolo processo.

Uso di oggetti Mutex