Si vous voulez que chaque thread utilise la même variable membre, mais conserve également une copie séparée, vous avez une contradiction ici. Soit ils utilisent la même variable ou ils ne le font pas. Sauf si je ne te comprends pas bien. Cela dit, si vous avez réellement besoin d'un champ statique accessible par plusieurs threads, chacun conservant sa propre valeur privée, vous pouvez utiliser l'attribut ThreadStatic
. Cet attribut garantit que le champ statique sera privé pour chaque thread ("thread local" comme il est habituellement appelé).
[ThreadStatic]
private static bool s_threadHasDoneItsWork;
Notez que vous ne pouvez pas initialiser un champ statique local fil par un constructeur statique ou directement static type field = value
. (Le compilateur ne se plaindra pas, mais il ne fonctionnera pas correctement.)
volatile
indique le temps d'exécution que le champ (statique ou non) doit toujours être accessible directement depuis la mémoire principale, de sorte que vous n » t besoin d'utiliser des verrous ou des barrières de mémoire pour synchroniser les threads et les cœurs. Il est toujours à jour, pour ainsi dire, alors que d'autres champs peuvent toujours attendre que le cache mémoire de votre processeur se synchronise avec votre mémoire principale.
Mais c'est exactement la limite de ce qu'il fait: seulement accès à ce domaine particulier. Dès que vous l'avez lu, la valeur est de nouveau obsolète, donc ne pensez jamais à faire quelque chose comme volatileField ++ (ce qui signifie "lire volatileField, ajouter un à la valeur que vous venez de lire, définir volatileField", et non "increment volatileField", vous devrez utiliser la classe Interlocked
pour cela, ce qui est beaucoup plus cher).
Un moyen sûr d'utiliser les champs volatiles est de les lire directement, mais lorsque vous les modifiez, utilisez un mécanisme de verrouillage avant de les lire ou de les écrire. (La seule exception raisonnable à laquelle je puisse penser est un drapeau booléen comme "J'ai fini maintenant".
L'utilisation pratique de champs volatils est, de manière non surprenante, plutôt limitée. Stick avec un verrouillage simple; le mot-clé lock
et les méthodes correspondantes de la classe Monitor
prennent en charge à la fois la synchronisation de la mémoire de l'utilisateur unique et (dès que vous entrez et sortez du verrou).
Oui J'ai vu l'attribut de Threadstatic sur le MSDN et il a confondu l'enfer hors de moi. Il semble aller à l'encontre de la définition d'une variable statique si chaque thread maintient sa propre copie personnelle. – Setheron
C'est en quelque sorte, oui. Mais cela peut être utile si vous devez maintenir un état spécifique au thread, ou indiquer que les méthodes qui sont appelées depuis l'une de vos méthodes doivent pouvoir y accéder, mais personne d'autre. En fonction de son utilisation, le stockage local des threads peut éviter la synchronisation des threads (car il n'y a pas de partage entre les threads), ce qui peut être utile. – Ruben
n'a même pas de sens pourquoi il aurait alors besoin du champ statique. Threadstatic seul devrait alors avoir du sens. – Setheron