Uso degli oggetti di sezione critica

Nell'esempio seguente viene illustrato come un thread inizializza, immette e rilascia una sezione critica . Usa le funzioni InitializeCriticalSectionAndSpinCount, EnterCriticalSection, LeaveCriticalSection, e DeleteCriticalSection.

Avvertimento

Rischio di deadlock: Se un thread deve acquisire più sezioni critiche, acquisirle sempre in un ordine coerente e documentato in tutti i thread. L'acquisizione di blocchi in ordini diversi da thread diversi è la causa più comune di deadlock. Si noti anche che EnterCriticalSection si blocca indefinitamente: usare TryEnterCriticalSection per tentativi di acquisizione non bloccanti e implementare un ciclo di tentativi limitato da una scadenza se è necessaria un'acquisizione temporizzata del lock.

Note

Alternativa C++ moderna: Per il nuovo codice, è consigliabile usare std::mutex con std::lock_guard o std::scoped_lock (C++17), che forniscono la gestione dei blocchi basata su RAII che garantisce il rilascio anche quando vengono generate eccezioni. Per i carichi di lavoro a elevata intensità di lettura, valutare blocchi SRW (Slim Reader/Writer) 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;
}