Sobre sincronização

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:

Para obter informações adicionais sobre sincronização, consulte Problemas de sincronização e multiprocessador.