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.
Para sincronizar o acesso a um recurso, use um dos objetos de sincronização em uma das funções de espera. O estado de um objeto de sincronização é sinalizado ou não sinalizado. As funções de espera permitem que uma thread bloqueie sua própria execução até que um objeto não sinalizado especificado entre no estado sinalizado. Para obter mais informações, consulte Sincronização entre processos.
Escolhendo o primitivo de sincronização correto
| Primitivo | Scope | Performance | Reentrante | Quando usar |
|---|---|---|---|---|
| Bloqueio de Leitor/gravador slim (SRW). | Processo único | Rápido (normalmente no modo usuário; pode entrar no kernel sob contenção) | No | Opção padrão para cargas de trabalho com predominância de leitura em código moderno. Menor uso de memória (do tamanho de um ponteiro). |
| Seção Crítica | Processo único | Rápido (gira e, em seguida, o kernel aguarda) | Sim | Use quando precisar de bloqueio reentrante/recursivo em um processo. Um pouco maior que SRW. |
| Mutex | Processo cruzado (nomeado) | Mais lento (sempre objeto do kernel) | Sim | Necessário para sincronização entre processos por meio de um mutex nomeado. Também útil com WaitForMultipleObjects. |
| Semáforo | Processo cruzado (nomeado) | Objeto Kernel | N/A | Limita o acesso simultâneo a um pool de recursos (por exemplo, pool de conexões de N itens). |
| Acontecimento | Processo cruzado (nomeado) | objeto do kernel | N/A | Sinalização entre threads/processos. Use para notificações "algo aconteceu", não para proteger dados. |
C++ std::mutex / std::shared_mutex |
Processo único | Implementation-defined | No | Preferencial para código C++ portátil e RAII. Use quando você não precisar de APIs de espera do Win32 ou sincronização entre processos. |
Note
Bloqueios srw versus seções críticas: para um novo código que não exija bloqueio recursivo, prefira bloqueios SRW (AcquireSRWLockExclusive/AcquireSRWLockShared). Eles são menores, mais rápidos e dão suporte à semântica de leitor/gravador. As seções críticas ainda são indicadas quando você precisa de aquisição reentrante (recursiva) pelo mesmo thread.
Importante
Equívoco comum: uso de um Mutex para sincronização intraprocesso quando uma seção crítica ou bloqueio SRW bastaria. Os mutexes sempre envolvem uma transição de modo kernel, tornando-os significativamente mais lentos para operações de alta frequência em um único processo.
Veja a seguir outros mecanismos de sincronização:
- entrada e saída sobrepostas
- Chamadas de procedimento assíncrono
- objetos de seção críticos
- variáveis de condição
- Bloqueios de leitor/gravador fino.
- inicialização única
- acesso variável interlocked
- listas interlocked de ligação simples
- filas de temporizador
- a macro MemoryBarrier
Para obter informações adicionais sobre sincronização, consulte Problemas de sincronização e multiprocessador.