Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 :
- entrée et sortie superposées
- appels de procédure asynchrones
- objets de section critique
- variables de condition
- verrous lecteur/enregistreur minces
- Initialisation ponctuelle
- Accès aux variables verrouillées
- Listes liées entrelacées
- files d’attente de temporisateur
- la macro MemoryBarrier
Pour plus d’informations sur la synchronisation, consultez Problèmes de synchronisation et de multiprocesseur.