Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você 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çõesInitializeCriticalSectionAndSpinCount, EnterCriticalSection, LeaveCriticalSectione DeleteCriticalSection.
Aviso
Risco de deadlock: Se um thread precisar adquirir várias seções críticas, adquira-as sempre em uma ordem consistente e documentada em todos os threads. A aquisição de bloqueios em ordens diferentes a partir de threads diferentes é a causa mais comum de impasses. Observe também que EnterCriticalSection bloqueia indefinidamente — use TryEnterCriticalSection para tentativas de aquisição não bloqueantes e implemente um loop de repetição limitado com um prazo limite se precisar de aquisição de bloqueio temporizada.
Note
Alternativa moderna do C++: Para um novo código, considere usar std::mutex com std::lock_guard ou std::scoped_lock (C++17), que fornece gerenciamento de bloqueio baseado em RAII que garante a liberação mesmo quando exceções são lançadas. Para cargas de trabalho com muitas leituras, considere Slim Reader/Writer (SRW) Locks 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;
}