Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O exemplo a seguir mostra como um thread inicializa, insere e libera uma seção crítica . Ele usa as funções InitializeCriticalSectionAndSpinCount, EnterCriticalSection, LeaveCriticalSectione DeleteCriticalSection.
Warning
Risco de impasse: Se um thread tiver de adquirir múltiplas secções críticas, adquira-as sempre numa ordem consistente e documentada em todos os threads. Adquirir bloqueios em diferentes ordens de diferentes threads é a causa mais comum de deadlocks. Note também que EnterCriticalSection bloqueia indefinidamente — use TryEnterCriticalSection para tentativas de aquisição sem bloqueio e implemente um ciclo de repetição limitado com um tempo limite, se precisar de aquisição temporizada do bloqueio.
Note
Alternativa moderna em C++: Para código novo, considere utilizar std::mutex com std::lock_guard ou com std::scoped_lock (C++17), que fornecem uma gestão de bloqueios baseada no princípio RAII, garantindo a sua libertação mesmo quando são lançadas exceções. Para cargas de trabalho com muitas operações de leitura, considere bloqueios Slim Reader/Writer (SRW) ou 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;
}