2010-01-01 20 views
5

Windows Mutex sembra consentire di acquisire nuovamente un blocco acquisito (in modo ricorsivo) se il thread attualmente proprietario del blocco tenta di acquisirlo.Come modificare il comportamento di blocco ricorsivo di Windows Mutex?

Tuttavia, i blocchi pthread basati su posix non consentono tale comportamento.

Esiste una macro di tempo di compilazione o qualsiasi impostazione che può comportare il comportamento del mutex di Windows nello stesso modo del mutex pthread?

risposta

6

Finché si programma in Windows, evitare di reimplementare il comportamento del suo Mutex. Essere rientranti dallo stesso thread è assolutamente essenziale per il suo comportamento definito.

Un oggetto di sincronizzazione senza affinità di thread è un semaforo che conta 1. Utilizzare CreateSemaphore().

Fwiw, è molto curioso che tu abbia bisogno di questo tipo di comportamento. Sembra che tu stia cercando di utilizzare lo stesso oggetto di sincronizzazione in più punti in modo inappropriato. Puoi usare il semaforo ma perderai il potenziale di concorrenza. Considera invece l'utilizzo di più di un mutex.

+0

In realtà, ho questo problema relativo al codice precedente e voglio risolverlo senza modificare gran parte della logica. Quindi, volevo sapere se il comportamento può essere modificato. Il mio codice dovrebbe funzionare in più SO, quindi voglio che il comportamento rimanga uguale su tutto il sistema operativo. "Sembra che tu stia cercando di utilizzare lo stesso oggetto di sincronizzazione in più posti in modo inappropriato." - Sì. È il caso di uno scenario negativo. Voglio solo che il comportamento sia lo stesso in tutti i sistemi operativi nello scenario negativo. Grazie per la tua risposta! – Jay

+1

Bene, usa un semaforo boost. Multipiattaforma e non rientranti. –

+0

+1 (il commento di follow-up è buono come la risposta). – WhozCraig

0

Dai un'occhiata a questo articolo nel numero 'fast mutex'.

Questi tipi di mutex non possono essere acquisiti in modo ricorsivo.

Fuori rotta, che avrebbe dovuto esaminare come implementarle in C.

+0

Il supporto Fast Mutex è destinato ai driver, non al codice in modalità utente. – gavinb

6

Non è possibile modificare il fatto che i Mutex di Windows sono ricorsivi. E mentre i thread Posix non sono ricorsivi per impostazione predefinita, è possibile utilizzare pthread_mutexattr_settype() con il flag PTHREAD_MUTEX_RECURSIVE per crearne uno.

Il blocco di un mutex in Windows è un'operazione piuttosto costosa e più adatta alla sincronizzazione tra processi. Per un mutex utilizzato solo all'interno di un singolo processo, viene normalmente utilizzata una sezione critica, tuttavia anche questi sono rientranti. Come afferma nobugz, è necessario utilizzare un semaforo, inizializzato con un conteggio massimo pari a 1, per ottenere la sincronizzazione non ricorsiva.

Un oggetto semaforo è come un contatore speciale, che può essere incrementato e decrementato atomicamente attraverso i thread (o processi, se creati condivisi). Creandone uno con un conteggio massimo pari a 1, ottieni il comportamento non ricorsivo richiesto.

+0

Sezione critica PU CAN essere nuovamente inserita dallo stesso thread. http://msdn.microsoft.com/en-us/library/ms682608(VS.85).aspx – arke

+0

Grazie per aver capito che oops - risposta fissa di conseguenza. – gavinb

Problemi correlati