Sobre a Sincronização

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:

Para informações adicionais sobre sincronização, consulte Questões de Sincronização e Multiprocessadores.