Por ejemplo, ¿esto sería válido?¿Es válido anidar una sección crítica?
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);
Obviamente, yo nunca haría intencionalmente esto, pero lo que si esto llegara a suceder como resultado de las llamadas a funciones tales que el "primer nivel" es llamado a bloquear un objeto para un complejo (por ejemplo, búsqueda) Algoritmo y el "segundo nivel" se llama en las funciones de acceso de ese objeto?
+1 ¡No sabía eso! – Valmond
Lo mismo se aplica a todos los otros tipos de objetos de sincronización: mutex, semáforos, etc. Una vez que un hilo ha obtenido un bloqueo, puede volver a ingresar el bloqueo tantas veces como quiera sin bloquear. Solo asegúrese de liberar el bloqueo la misma cantidad de veces que lo ingrese para que se libere correctamente para que otros hilos obtengan. –
@Remy: no, no se aplica a todos los demás tipos de objetos de sincronización. Ciertamente puede tener mutexes no reentrantes. –