Partilhar via


Função SetCriticalSectionSpinCount (synchapi.h)

Define a contagem de rotação para a seção crítica especificada. Girar significa que quando um thread tenta adquirir uma seção crítica que está bloqueada, o thread entra em um loop, verifica se o bloqueio é liberado e, se o bloqueio não é liberado, o thread entra em suspensão.

Sintaxe

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

Parâmetros

[in, 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 zero (0). 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

A função retorna a contagem de rotação anterior para a seção crítica.

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

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.

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.

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íticos

Initializecriticalsection

InitializeCriticalSectionAndSpinCount

WaitForSingleObject

Funções de sincronização

APIs Vertdll disponíveis em enclaves de VBS