Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Para sincronizar o acesso a um recurso, use um dos objetos de sincronização numa 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 a sua própria execução até que um objeto não sinalizado especificado seja definido para o estado sinalizado. Para mais informações, consulte Sincronização entre processos.
Escolher a primitiva de sincronização certa
| Primitivo | Scope | Performance | Reentrante | Quando utilizar |
|---|---|---|---|---|
| Fechadura Slim Reader/Writer (SRW) | Processo único | Rápido (tipicamente em modo de utilizador; pode passar para o kernel em caso de contenção) | No | Escolha padrão para cargas de trabalho com leituras intensivas no código moderno. A menor pegada de memória (do tamanho de um ponteiro). |
| Secção Crítica | Processo único | Rápido (faz espera ativa e depois entra em espera no kernel) | Yes | Usa quando precisares de bloqueio reentrante/recursivo dentro de um processo. Ligeiramente maior do que o SRW. |
| Mutex | Entre processos (com nome) | Mais lento (sempre objeto kernel) | Yes | Necessária para sincronização entre processos por meio de um mutex nomeado. Também útil com WaitForMultipleObjects. |
| Semáforo | Entre processos (com nome) | objeto do kernel | N/A | Limita o acesso concorrente a um pool de recursos (por exemplo, pool de ligação de N itens). |
| Event | Entre processos (com nome) | Objeto do kernel | N/A | Sinalização entre threads/processos. Use para notificações de "algo aconteceu", não para proteger dados. |
C++ std::mutex / std::shared_mutex |
Processo único | Definido pela implementação | No | Preferido para código C++ portátil e RAII. Usa quando não precisares de APIs de espera no Win32 ou sincronização entre processos. |
Note
Bloqueios SRW vs Secções Críticas: Para código novo que não exige bloqueio recursivo, prefira bloqueios SRW (AcquireSRWLockExclusive/AcquireSRWLockShared). São mais pequenos, rápidos e suportam a semântica do leitor/escritor. As secções críticas continuam a ser apropriadas quando é necessária a aquisição recursiva (reentrante) pela mesma thread.
Importante
Erro comum: Usar um Mutex para sincronização intra-processo quando um bloqueio de Secção Crítica ou SRW seria suficiente. Os mutexes envolvem sempre uma transição em modo kernel, tornando-os significativamente mais lentos para operações de alta frequência dentro de um único processo.
Seguem-se outros mecanismos de sincronização:
- Entrada e saída sobrepostas
- chamadas de procedimento assíncronas
- Objetos da secção crítica
- Variáveis de condição
- Fechaduras finas para leitor/escritor
- Inicialização única
- acesso interbloqueado a variáveis
- Listas interligadas, interligadas individualmente
- Filas temporizadoras
- o macro MemoryBarrier
Para informações adicionais sobre sincronização, consulte Questões de Sincronização e Multiprocessadores.