À propos de la synchronisation

Pour synchroniser l’accès à une ressource, utilisez l’un des objets de synchronisation dans l’une des fonctions d’attente. L’état d’un objet de synchronisation est signalé ou non signé. Les fonctions d’attente permettent à un thread de bloquer sa propre exécution jusqu’à ce qu’un objet spécifié à l’état non signalé passe à l’état signalé. Pour plus d’informations, consultez Synchronisation interprocess.

Choix de la primitive de synchronisation appropriée

Primitif Scope Performance Réentrant Quand utiliser
Verrouillage du lecteur/enregistreur slim (SRW) Processus unique Rapide (généralement en mode utilisateur ; peut entrer dans le noyau en cas de contention) Non Choix par défaut pour les charges de travail gourmandes en lecture dans le code moderne. Empreinte mémoire la plus petite (taille du pointeur).
Section critique Processus unique Rapide (rotations puis attente du noyau) Oui À utiliser lorsque vous avez besoin d’un verrouillage réentrant/récursif au sein d’un processus. Légèrement plus grand que SRW.
Mutex Interprocesseur (nommé) Plus lent (toujours l’objet noyau) Oui Obligatoire pour la synchronisation entre les processus au moyen d’un mutex nommé. Également utile avec WaitForMultipleObjects.
Sémaphore Interprocesseur (nommé) Objet noyau N/A Limite l’accès simultané à un pool de ressources (par exemple, un pool de connexions de N éléments).
Event Interprocesseur (nommé) Objet noyau N/A Signalisation entre threads/processus. Utilisez pour les notifications « quelque chose s’est produit », et non pour protéger les données.
C++ std::mutex / std::shared_mutex Processus unique Défini par l’implémentation Non Préféré pour le code C++ portable et RAII. Utilisez quand vous n’avez pas besoin d’API d’attente Win32 ou d’une synchronisation entre processus.

Note

Verrous SRW et sections critiques : pour le nouveau code qui ne nécessite pas de verrouillage récursif, préférez les verrous SRW (AcquireSRWLockExclusive/AcquireSRWLockShared). Elles sont plus petites, plus rapides et prennent en charge la sémantique lecteur/rédacteur. Les sections critiques sont toujours appropriées lorsque vous avez besoin d’une acquisition récursive (récursive) par le même thread.

Important

Erreur courante : Utilisation d’un mutex pour la synchronisation intra-processus lorsqu’une section critique ou un verrou SRW suffirait. Les mutex impliquent toujours une transition en mode noyau, ce qui les rend beaucoup plus lentes pour les opérations à haute fréquence au sein d’un seul processus.

Voici d’autres mécanismes de synchronisation :

Pour plus d’informations sur la synchronisation, consultez Problèmes de synchronisation et de multiprocesseur.