Ad esempio, sarebbe valido?È valido annidare una sezione critica?
CRITICAL_SECTION cs;
::InitializeCriticalSection(&cs);
::EnterCriticalSection(&cs); // First level
::EnterCriticalSection(&cs); // Second level
/* do some stuff */
::LeaveCriticalSection(&cs); // Second level
::LeaveCriticalSection(&cs); // First level
::DeleteCriticalSection(&cs);
Ovviamente, non avrei mai intenzionalmente fare questo, ma se questo dovesse accadere a seguito di chiamate di funzione in modo che il "primo livello" viene chiamato a bloccare un oggetto per un complesso (ad esempio, di ricerca) l'algoritmo e il "secondo livello" viene chiamato nelle funzioni di accesso di quell'oggetto?
+1 Non lo sapevo! – Valmond
Lo stesso vale per tutti gli altri tipi di oggetti di sincronizzazione: mutex, semafori, ecc. Una volta che un thread ha ottenuto un blocco, può rientrare nel blocco tutte le volte che lo desidera senza bloccare. Assicurati di rilasciare il blocco lo stesso numero di volte in cui lo inserisci, in modo che venga rilasciato correttamente per ottenere altri thread. –
@Remy: no, non si applica a tutti gli altri tipi di oggetti di sincronizzazione. Puoi certamente avere mutex non rientranti. –