Share via


Função InitializeCriticalSectionAndSpinCount (synchapi.h)

Inicializa um objeto de seção crítica e define a contagem de rotação para a seção crítica. Quando um thread tenta adquirir uma seção crítica que está bloqueada, o thread gira: ele insere um loop que itera tempos de contagem de rotação, verificando se o bloqueio foi liberado. Se o bloqueio não for liberado antes da conclusão do loop, o thread entrará em suspensão para aguardar a liberação do bloqueio.

Sintaxe

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

Parâmetros

[out] lpCriticalSection

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

[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 girará 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.

Retornar valor

Essa função sempre é bem-sucedida e retorna um valor diferente de zero.

Windows Server 2003 e Windows XP: Se a função for bem-sucedida, o valor retornado será diferente de zero. Se a função falhar, o valor retornado será zero 0. Para obter informações de erro estendidas, chame GetLastError. A partir do Windows Vista, a função InitializeCriticalSectionAndSpinCount sempre é bem-sucedida, mesmo em situações de memória insuficiente.

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ítica é 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ítica 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ítica deve ser excluído antes que 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 ocorrer contenção. 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. Por exemplo, o gerenciador de heap usa uma contagem de rotação de aproximadamente 4.000 para suas seções críticas por heap.

Para compilar um aplicativo que usa essa função, defina _WIN32_WINNT como 0x0403 ou posterior. Para obter mais informações, consulte Usando os cabeçalhos do Windows.

Exemplos

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

Requisitos

   
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

InitializeCriticalSectionEx

SetCriticalSectionSpinCount

Funções de sincronização

WaitForSingleObject

APIs Vertdll disponíveis em enclaves de VBS