Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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;
}