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:
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 .