Partilhar via


Função InitializeCriticalSectionEx (synchapi.h)

Inicializa um objeto de seção crítico com uma contagem de rotação e sinalizadores opcionais.

Sintaxe

BOOL InitializeCriticalSectionEx(
  [out] LPCRITICAL_SECTION lpCriticalSection,
  [in]  DWORD              dwSpinCount,
  [in]  DWORD              Flags
);

Parâmetros

[out] lpCriticalSection

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

[in] dwSpinCount

A contagem de rotação para o objeto de seção crítica. Em sistemas de processador único, a contagem de rotação é ignorada e a contagem de rotação de seção crítica é definida como 0 (zero). Em sistemas multiprocessadores, se a seção crítica não estiver disponível, o thread de chamada spin dwSpinCount vezes antes de executar uma operação de espera em um semáforo associado à seção crítica. Se a seção crítica ficar livre durante a operação de rotação, o thread de chamada evitará a operação de espera.

[in] Flags

Esse parâmetro pode ser 0 ou o valor a seguir.

Valor Significado
CRITICAL_SECTION_NO_DEBUG_INFO A seção crítica é criada sem informações de depuração.

Valor retornado

Se a função for bem-sucedida, o valor retornado será diferente de zero.

Se a função falhar, o valor retornado será 0 (zero). Para obter informações de erro estendidas, chame GetLastError.

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. Não há nenhuma garantia sobre a ordem em que os threads obtêm a propriedade da seção crítica, no entanto, o sistema é justo com todos os threads.

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 inicializar o objeto. Posteriormente, você pode modificar a contagem de rotação chamando a função SetCriticalSectionSpinCount .

Depois que um objeto de seção crítico é inicializado, os threads do processo podem especificar o objeto na função EnterCriticalSection, TryEnterCriticalSection ou LeaveCriticalSection para fornecer acesso mutuamente exclusivo a um recurso compartilhado. Para sincronização semelhante entre os threads de processos diferentes, use um objeto mutex.

Um objeto de seção crítico não pode ser movido ou copiado. O processo também não deve modificar o objeto, mas deve tratá-lo como logicamente opaco. Use apenas as funções de seção críticas para gerenciar objetos de seção críticos. Quando terminar de usar a seção crítica, chame a função DeleteCriticalSection .

Um objeto de seção crítico deve ser excluído antes que ele possa ser reinicializado. Inicializar uma seção crítica que já está inicializada resulta em um comportamento indefinido.

A contagem de rotação é útil para seções críticas de curta duração que podem experimentar altos níveis de contenção. Considere um cenário pior, no qual um aplicativo em um sistema SMP tem dois ou três threads constantemente alocando e liberando memória do heap. O aplicativo serializa o heap com uma seção crítica. No pior cenário, a contenção para a seção crítica é constante e cada thread faz uma chamada intensiva de processamento para a função WaitForSingleObject . No entanto, se a contagem de rotação for definida corretamente, o thread de chamada não chamará WaitForSingleObject imediatamente quando a contenção ocorrer. Em vez disso, o thread de chamada poderá adquirir a propriedade da seção crítica se ela for liberada durante a operação de rotação.

Você pode melhorar significativamente o desempenho escolhendo uma pequena contagem de rotação para uma seção crítica de curta duração. O gerenciador de heap usa uma contagem de rotação de aproximadamente 4000 para suas seções críticas por heap. Isso proporciona um ótimo desempenho e escalabilidade em quase todos os piores cenários.

Requisitos

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

Confira também

Objetos de seção críticos

Deletecriticalsection

APIs Vertdll disponíveis em enclaves de VBS