Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El siguiente ejemplo muestra cómo un subproceso se inicializa, entra en una sección crítica y sale de ella. Usa las funciones InitializeCriticalSectionAndSpinCount, EnterCriticalSection, LeaveCriticalSection y DeleteCriticalSection .
Warning
Riesgo de interbloqueo: Si un subproceso debe adquirir varias secciones críticas, siempre debe adquirirlas en un orden coherente y documentado en todos los subprocesos. Adquirir bloqueos en distinto orden desde distintos hilos es la causa más común de los interbloqueos. Tenga en cuenta también que EnterCriticalSection bloquea indefinidamente: use TryEnterCriticalSection para realizar intentos de adquisición sin bloqueo e implemente un bucle de reintento limitado con un tiempo límite si necesita adquirir el bloqueo con tiempo limitado.
Note
Alternativa moderna de C++: Para el nuevo código, considere la posibilidad de usar std::mutex con std::lock_guard o std::scoped_lock (C++17), que proporcionan administración de bloqueos basada en RAII que garantiza la versión incluso cuando se producen excepciones. Para cargas de trabajo con predominio de lectura, considere los bloqueos Slim Reader/Writer (SRW) o std::shared_mutex.
// Global variable
CRITICAL_SECTION CriticalSection;
int main( void )
{
...
// Initialize the critical section one time only.
if (!InitializeCriticalSectionAndSpinCount(&CriticalSection,
0x00000400) )
return;
...
// Release resources used by the critical section object.
DeleteCriticalSection(&CriticalSection);
}
DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
...
// Request ownership of the critical section.
EnterCriticalSection(&CriticalSection);
// Access the shared resource.
// Release ownership of the critical section.
LeaveCriticalSection(&CriticalSection);
...
return 1;
}