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 correctement alignées sont des opérations atomiques. En d’autres termes, vous ne vous retrouverez pas avec une seule partie de la variable mise à jour ; tous les bits sont mis à jour de manière atomique. Toutefois, la synchronisation de l’accès n’est pas garantie. Si deux threads lisent et écrivent à partir de la même variable, vous ne pouvez pas déterminer si un thread effectuera 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 correctement alignées sont atomiques sur Windows 64 bits. Il n’est pas garanti que les lectures et les écritures dans des valeurs 64 bits soient atomiques sur Windows 32 bits. Il n’est pas garanti que les lectures et les écritures dans des variables d’autres tailles soient atomiques sur n’importe quelle plateforme.

L’API verrouillée

Les fonctions verrouillé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 pourraient 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 aux variables 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, InterlockedCompare64Exchange128 et InterlockedCompareExchangePointer combinent deux opérations : la comparaison de deux valeurs et le stockage d’une troisième valeur dans l’une des variables, en fonction du résultat de la comparaison.

Les fonctions InterlockedAnd, InterlockedOr et InterlockedXor effectuent atomiquement les opérations AND, OR et XOR, respectivement.

Il existe des fonctions spécifiquement conçues pour effectuer un accès aux variables verrouillées sur des adresses et des valeurs mémoire 64 bits, et qui 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 verrouillé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 de base verrouillées 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 son nom ; par exemple , InterlockedDecrementAcquire et InterlockedDecrementRelease. La sémantique d’acquisition de la mémoire spécifie que l’opération de mémoire effectuée par le thread actuel sera visible avant toute autre opération de mémoire. La sémantique de la 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 l’exécution d’opérations de mémoire dans un ordre spécifique. Utilisez la sémantique d’acquisition lors de l’entrée d’une région protégée et libérez la sémantique en la quittant.

compilateur, fonctions intrinsèques

Problèmes de synchronisation et de multiprocesseur