Que fait réellement Interlocked.Increment?

Interlocked.Increment semble être l’une des opérations les plus simples et les plus simples à effectuer dans un code multithread.

Je suppose que la fonctionnalité de la méthode est un type de sorting que toute personne expérimentée en threading pourrait reproduire.

Donc, fondamentalement, je me demande si quelqu’un pourrait fournir une copie exacte (avec une explication de son fonctionnement) de ce que la méthode Interlocked.Increment fait réellement en interne? (J’ai cherché la source de la méthode mais je suis incapable de la trouver)

Selon M. Albahari, il fait deux choses:

  • fait connaître le caractère atomique de l’opération au système d’exploitation et à la machine virtuelle, de sorte que, par exemple, les opérations sur des valeurs 64 bits sur un système 32 bits soient atomiques
  • génère full fence limitant la réorganisation et la mise en cache des vars verrouillés

Regardez ce lien – il donne quelques exemples intéressants.

Je suppose que c’est un détail d’implémentation, mais une façon de le regarder est d’inspecter le code compilé JIT. Considérez l’exemple suivant.

 private static int Value = 42; public static void Foo() { Interlocked.Increment(ref Value); } 

Sur x86, il génère ce qui suit

 lock inc dword  

Le modificateur de locking verrouille le bus pour empêcher plusieurs CPU de mettre à jour le même emplacement de données.

Sur x64 il génère

 lock xadd dword ptr ,eax 

Je m’attendrais à ce qu’il soit un wrapper à l’appel API InterlockedIncrement64 Win32.


EDIT: Je vois que c’était une réponse très courte. Construire un peu dessus: Il est facile de reproduire les fonctionnalités de la fonction, mais pas les performances. Il existe des instructions natives dans la plupart des processeurs qui vous fournissent l’instruction atomique “Interlocked exchange and add”. Vous souhaitez donc que cette instruction soit utilisée pour implémenter votre fonction, et j’espère que le moyen le plus simple de réaliser cela à partir de C # serait faire l’appel de l’API win32. Pour plus d’informations sur le sujet, consultez ce livre blanc .