Partager via


Accès aux variables verrouillées

Les applications doivent synchroniser l’accès aux variables partagées par plusieurs threads. Les applications doivent également s’assurer que les opérations sur ces variables sont effectuées atomiquement (effectuées dans leur intégralité ou pas du tout).)

Les lectures et écritures simples dans des variables 32 bits alignées correctement sont des opérations atomiques. En d’autres termes, vous ne finirez pas par une seule partie de la variable mise à jour ; tous les bits sont mis à jour de manière atomique. Toutefois, l’accès n’est pas garanti pour être synchronisé. Si deux threads lisent et écrivent à partir de la même variable, vous ne pouvez pas déterminer si un thread effectue son opération de lecture avant que l’autre n’effectue son opération d’écriture.

Les lectures et écritures simples dans des variables 64 bits alignées correctement sont atomiques sur Windows 64 bits. Les lectures et les écritures dans des valeurs 64 bits ne sont pas garanties d’être atomiques sur Windows 32 bits. Les lectures et les écritures dans des variables d’autres tailles ne sont pas garanties d’être atomiques sur n’importe quelle plateforme.

L’API interblocée

Les fonctions interblocées fournissent un mécanisme simple pour synchroniser l’accès à une variable partagée par plusieurs threads. Ils effectuent également des opérations sur des variables de manière atomique. Les threads de différents processus peuvent utiliser ces fonctions si la variable est en mémoire partagée.

Les fonctions InterlockedIncrement et InterlockedDecrement combinent les étapes impliquées dans l’incrémentation ou la décrémentation d’une variable dans une opération atomique. Cette fonctionnalité est utile dans un système d’exploitation multitâche, dans lequel le système peut interrompre l’exécution d’un thread pour accorder une tranche de temps processeur à un autre thread. Sans cette synchronisation, deux threads peuvent lire la même valeur, l’incrémenter de 1 et stocker la nouvelle valeur pour une augmentation totale de 1 au lieu de 2. Les fonctions d’accès variable verrouillées protègent contre ce type d’erreur.

Les fonctions InterlockedExchange et InterlockedExchangePointer échangent atomiquement les valeurs des variables spécifiées. La fonction InterlockedExchangeAdd combine deux opérations : l’ajout de deux variables et le stockage du résultat dans l’une des variables.

Les fonctions interlockedCompareExchange , InterlockedCompare64Exchange128et InterlockedCompareExchangePointer combinent deux opérations : comparer deux valeurs et stocker une troisième valeur dans l’une des variables, en fonction du résultat de la comparaison.

Les fonctions InterlockedAnd, InterlockedOret InterlockedXor effectuent respectivement des opérations AND, OR et XOR.

Il existe des fonctions spécifiquement conçues pour effectuer un accès aux variables interblocées sur les valeurs et adresses de mémoire 64 bits, et sont optimisées pour une utilisation sur Windows 64 bits. Chacune de ces fonctions contient « 64 » dans le nom ; par exemple, InterlockedDecrement64 et InterlockedCompareExchangeAcquire64.

La plupart des fonctions interblocées fournissent des barrières de mémoire complètes sur toutes les plateformes Windows. Il existe également des fonctions qui combinent les opérations d’accès aux variables interblocées de base avec la sémantique d’acquisition et de mise en production de la mémoire prise en charge par certains processeurs. Chacune de ces fonctions contient le mot « Acquire » ou « Release » dans leurs noms ; par exemple, InterlockedDecrementAcquire et InterlockedDecrementRelease. Acquérir la sémantique de mémoire spécifie que l’opération de mémoire effectuée par le thread actuel sera visible avant toute tentative d’autres opérations de mémoire. La sémantique de mémoire de mise en production spécifie que l’opération de mémoire effectuée par le thread actuel sera visible une fois toutes les autres opérations de mémoire terminées. Ces sémantiques vous permettent de forcer les opérations de mémoire à effectuer dans un ordre spécifique. Utilisez la sémantique d’acquisition lors de la saisie d’une région protégée et de la sémantique de mise en production lors de sa sortie.

intrinsèques du compilateur

Problèmes de synchronisation et de multiprocesseur