Condividi tramite


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à. Un solo 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 funzioneCreateMutexo 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 oggetti mutex, eventi, semafori e timer, vedere Sincronizzazione interprocesso.

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

Qualsiasi thread con un handle per 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 richiedente fino a quando il thread proprietario rilascia l'oggetto mutex usando la funzioneReleaseMutex. Il valore restituito della funzione wait indica se la funzione restituita per qualche motivo diverso dallo stato del mutex impostato su segnalato.

Se più thread sono in attesa di un mutex, viene selezionato un thread in attesa. Non presupporre un ordine FIFO (First-In First-In, 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 bloccarne l'esecuzione. Ciò impedisce a un thread di bloccarsi 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 wait 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 per l'oggetto mutex viene successivamente specificato in una funzione di attesa.

Si noti che oggetti sezione critica fornire sincronizzazione simile a quella fornita dagli oggetti mutex, ad eccezione del fatto che gli oggetti sezione critica possono essere usati solo dai thread di un singolo processo.

uso di oggetti Mutex