Compartilhar via


Função EnterCriticalSection (synchapi.h)

Aguarda a propriedade do objeto de seção crítica especificado. A função retorna quando o thread de chamada recebe a propriedade.

Sintaxe

void EnterCriticalSection(
  [in, out] LPCRITICAL_SECTION lpCriticalSection
);

Parâmetros

[in, out] lpCriticalSection

Um ponteiro para o objeto de seção crítica.

Retornar valor

Essa função não retorna um valor.

Essa função poderá gerar EXCEPTION_POSSIBLE_DEADLOCK, também conhecida como STATUS_POSSIBLE_DEADLOCK, se uma operação de espera na seção crítica atingir o tempo limite. O intervalo de tempo limite é especificado pelo seguinte valor do Registro: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CriticalSectionTimeout. Não manipule uma possível exceção de deadlock; em vez disso, depure o aplicativo.

Comentários

Os threads de um único processo podem usar um objeto de seção crítico para sincronização de exclusão mútua. O processo é responsável por alocar a memória usada por um objeto de seção crítico, o que pode ser feito declarando uma variável do tipo CRITICAL_SECTION. Antes de usar uma seção crítica, algum thread do processo deve chamar InitializeCriticalSection ou InitializeCriticalSectionAndSpinCount para inicializar o objeto.

Para habilitar o acesso mutuamente exclusivo a um recurso compartilhado, cada thread chama a função EnterCriticalSection ou TryEnterCriticalSection para solicitar a propriedade da seção crítica antes de executar qualquer seção de código que acesse o recurso protegido. A diferença é que TryEnterCriticalSection retorna imediatamente, independentemente de ter obtido a propriedade da seção crítica, enquanto EnterCriticalSection bloqueia até que o thread possa assumir a propriedade da seção crítica. Quando terminar de executar o código protegido, o thread usará a função LeaveCriticalSection para renunciar à propriedade, permitindo que outro thread se torne proprietário e acesse o recurso protegido. Não há nenhuma garantia sobre a ordem em que os threads em espera adquirirão a propriedade da seção crítica.

Depois que um thread tiver a propriedade de uma seção crítica, ele poderá fazer chamadas adicionais para EnterCriticalSection ou TryEnterCriticalSection sem bloquear sua execução. Isso impede que um thread seja deadlock enquanto aguarda uma seção crítica que ele já possui. O thread entra na seção crítica sempre que EnterCriticalSection e TryEnterCriticalSection são bem-sucedidos. Um thread deve chamar LeaveCriticalSection uma vez para cada vez que ele entrou na seção crítica.

Qualquer thread do processo pode usar a função DeleteCriticalSection para liberar os recursos do sistema que foram alocados quando o objeto de seção crítica foi inicializado. Depois que essa função tiver sido chamada, o objeto de seção crítica não poderá mais ser usado para sincronização.

Se um thread for encerrado enquanto tiver a propriedade de uma seção crítica, o estado da seção crítica será indefinido.

Se uma seção crítica for excluída enquanto ainda pertence, o estado dos threads que aguardam a propriedade da seção crítica excluída será indefinido.

Enquanto um processo está saindo, se uma chamada para EnterCriticalSection for bloqueada, ele encerrará o processo imediatamente. Isso pode fazer com que destruidores globais não sejam chamados.

Exemplos

Para obter um exemplo que usa EnterCriticalSection, consulte Usando objetos de seção críticos.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows XP [aplicativos da área de trabalho | aplicativos UWP]
Servidor mínimo com suporte Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho synchapi.h (inclua Windows.h no Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Biblioteca Kernel32.lib
DLL Kernel32.dll

Confira também

Objetos de seção crítica

Deletecriticalsection

Initializecriticalsection

InitializeCriticalSectionAndSpinCount

Leavecriticalsection

Funções de sincronização

TryEnterCriticalSection

APIs Vertdll disponíveis em enclaves de VBS