C# variable fil de sécurité
Quelques questions à propos de l'accès à une variable locale à partir de plusieurs threads à la fois:
-
J'ai plusieurs threads de l'écriture et de la lecture de la valeur d'une variable, dois-je synchroniser l'accès ou non?
-
La variable est mise à jour toutes les quelques secondes de Thread1 et de la lecture et de la mise à jour de la Base de données toutes les quelques secondes de Thread2.
-
Les problèmes qui peuvent survenir si je ne tiens pas à toute logique et n'ont pas de problèmes de concurrence?
-
Dois-je utiliser volatile pour cela?
EDIT:
Je tiens à souligner que je n'ai pas de problèmes de concurrence. Voici mon scénario:
un. Ma variable est le nom de pingLatency
et des mesures de ping latence
b. Thread1 est l'envoi d'un ping vers 8.8.8.8 chaque 10 secondes et écrit la latence de pingLatency
c. Thread2 mises à jour d'un correcposing champ avec la valeur de pingLatency
chaque 10 secondes.
d. Thread2 met à jour la même ligne de base de données à chaque fois.
Maintenant, je suis en utilisant ce champ de base de données pour surveiller la connectivité réseau. Ma question est, Peut-il y avoir une situation où la variable n'est pas mise à jour ou de lever une exception en raison de thread questions de sécurité? Je veux éviter d'utiliser lock
car il semble juste comme un overkill.
Qu'en pensez-vous?
Ce qui, exactement, voulez-vous dire par "variable locale"? Post un exemple.
Je suppose que quand tu dis variable vous avez réellement dire , car variable est toujours , et alors vous ne serait pas en mesure d'accéder qu'à partir de plusieurs threads.
J'ai vérifié @Mgets comme la réponse correcte en raison du lien dans la première ligne.
vous pouvez accéder à un local à partir de plusieurs threads, pas de problème. Et non, une variable n'est pas toujours locales. Une variable est toute l'emplacement de stockage.
OriginalL'auteur Uri Abramson | 2013-07-31
Vous devez vous connecter pour publier un commentaire.
volatile
, par Eric Lippert, c'est trop compliqué et la sémantique est très bizarre.Être prudent de briser le modèle de mémoire, C# en gros, suit la plupart des autres langues dans l'utilisation séquentielle de la cohérence des données de la course des programmes gratuits (SC-DRF). Volatilité des sauts de cela, donc il suffit d'utiliser des verrous pour empêcher les données de la course.
Comme pour
lock
il n'est pas aussi lourd qu'on pourrait le croire, dans la plupart des cas, la serrure ne sera pas soutenu dans le scénario que vous imaginez. Afin d'acquérir le verrou doit être indolore dans la plupart des cas.volatile
, il a dit qu'il n'a probablement pas ce que vous pensez que cela fonctionne.volatile
est tout à fait approprié si vous savez ce que cela signifie et ne.étant donné que la documentation dit quelque chose de différent que Eric, je vais aller avec éviter
volatile
que cela signifie que même MS n'est pas sûr de ce quevolatile
moyens. Aussi Eric est très clair quevolatile
pauses SC-DRF.Volatile implique atomique en ce que seul atomique champs peuvent être volatils.
Je pourrais être la lecture de votre ancien blog de mal, mais il est apparu que
volatile
eu des problèmes avec la SC-DRF, en particulier avec à la fois la cohérence séquentielle, et les données de la course de bits...Volatile ne fait pas non atomique mises à jour dans les mises à jour atomiques. Par exemple, deux concurrentes x++ sur un champ volatile peut perdre encore une mise à jour. Mais à chaque lecture et d'écriture seront atomique. Ils ne peuvent pas être déchiré.
OriginalL'auteur Mgetz
Si vous le souhaitez .NET géré parallélisme utiliser le construit en bonnes choses. Le Parallélisme Des Tâches. Cela permettra de gérer les threads pour vous et vous pouvez utiliser les thread-safe variables qui sont construit en un peu comme un tableau/liste serait égale à ConcurrentBag, etc.
OriginalL'auteur Cubicle.Jockey
Si l'accès à votre variable est atomique et il n'y a pas de problèmes logiques que vous êtes OK.
selon cette vous pouvez savoir si vous utilisez une variable atomique.
OriginalL'auteur asafrob