J'ai besoin de créer un Thread-safe variable statique en C# .Net
ok, il est un peu plus compliqué que la question.
class A
{
static int needsToBeThreadSafe = 0;
public static void M1()
{
needsToBeThreadSafe = RandomNumber();
}
public static void M2()
{
print(needsToBeThreadSafe);
}
}
maintenant j'ai besoin que entre M1() et M2() appelle " needsToBeThreadSafe séjour Thread-Safe.
Vous voulez dire que vous souhaitez que les appels à M1() et M2() atomique?
Qu'entendez-vous par "reste" thread-safe"?
Qu'entendez-vous par "reste" thread-safe"?
OriginalL'auteur Storm | 2009-08-10
Vous devez vous connecter pour publier un commentaire.
Ce que vous pouvez essayer de demander à propos de la [ThreadStatic] attribut. Si vous souhaitez que chaque thread qui utilise la classe
A
d'avoir sa propre valeur deneedsToBeThreadSafe
ensuite vous avez juste besoin de décorer ce domaine avec l' [ThreadStatic] attribut.Pour plus d'informations, reportez-vous à la La documentation MSDN pour
ThreadStaticAttribute
.OK, mais ThreadStatic est autre chose que des Threads.
En quelque sorte, je viens de réaliser que ce qu'il est vraiment après est une valeur qui n'est pas partagé entre les Threads. En outre, ThreadStatic thread-safe depuis effectivement pas de deux threads accèdent à la même variable (même si on dirait qu'ils sont).
Bon travail sur la réponse à la question, mais en éliminant le risque de conflit en créant des copies locales signifie que c'est, par définition, n'est pas "thread-safe". Même s'il n'est pas "dangereux", le fil de sécurité signifie qu'il gère correctement plusieurs threads traitant avec le ressource, je ne dirais pas que la copie de la ressource est un moyen de le faire.
J' ne obtenir vos points et je ne veux pas prolonger inutilement la conversation, mais ma compréhension de "thread-safe" si un morceau de code est sûr d'exécuter simultanément sous plusieurs threads. "Thread local storage" est une banale mise en œuvre de cette définition et ne pourrait pas répondre à vos besoins si vous avez réellement besoin de données partagée. Si ce que vous avez besoin est de plusieurs threads d'exécution sans fils marcher sur les pieds des autres, et "thread local storage" répond à vos besoins, alors c'est le chemin à parcourir. En outre, l'article de Wikipedia (en.wikipedia.org/wiki/Thread_safety) semble d'accord avec moi.
OriginalL'auteur paracycle
Comment Sur:
OriginalL'auteur cosmo
Vous avez deux choix: le plus simple étant donné votre code présenté est le
volatile
mot-clé. déclarerneedsToBeThreadSafe
commestatic volatile int
et qui va garantir que n'importe quel thread qui fait référence à cette variable permettra d'obtenir la "dernière" de la copie, et la variable ne sera pas mis en cache dans votre code.Cela étant dit, si vous voulez, plus généralement, s'assurer que
M1()
etM2()
exécuter "croisé" (ou au moins exclusivement les uns des autres), alors vous voulez utiliser unlock
. Le plus propre syntaxe est avec un "verrouillage de bloc", comme ceci:Qui approche à prendre, c'est à vous et doivent être déterminés par le code. Si vous avez besoin pour s'assurer qu'un membre d'affectation obtient propagée à tous les fils et n'est pas mis en cache, le
volatile
mot-clé est plus simple et faire le travail tout aussi bien. Si c'est au-delà de cela, vous pouvez aller avec lalock
.OriginalL'auteur Adam Robinson
OriginalL'auteur Arsen Mkrtchyan
Son comme vous avez besoin d'un Volatile membre.
OriginalL'auteur C. Ross
Vous pouvez également utiliser le ReaderWriterLockSlim, qui est plus efficace pour de multiples lectures et moins écrit:
OriginalL'auteur HuBeZa
Pour commencer je suis d'accord avec les réponses à l'aide de
lock()
, c'est la manière la plus sûre.Mais il en existe une plus approche minimaliste, votre exemple de code ne montre que seule instructions à l'aide de
needsToBeThreadSafe
et depuisint
est atomique, vous avez seulement besoin d'empêcher la mise en cache par le compilateur à l'aide de volatile:Mais si vous avez besoin d'needsToBeThreadSafe être "thread-safe" sur plusieurs états, l'utilisation d'un verrou.
OriginalL'auteur Henk Holterman