web-dev-qa-db-fra.com

C #: Que se passe-t-il si une méthode statique est appelée à partir de plusieurs threads?

Dans mon application, j'ai une méthode statique appelée à partir de plusieurs threads en même temps. Existe-t-il un risque de confusion dans les données?

Dans ma première tentative, la méthode n'était pas statique et je créais plusieurs instances de la classe. Dans ce cas, mes données se sont mélangées d'une manière ou d'une autre. Je ne suis pas sûr de savoir comment cela se produit car cela n'arrive que parfois. Je suis toujours en train de déboguer. Mais maintenant, la méthode est statique, je n'ai aucun problème jusqu'à présent. Peut-être que c'est juste de la chance. Je ne sais pas à coup sûr.

87
TalkingCode

Les variables déclarées dans les méthodes (à l'exception possible des variables " capturées ") sont isolées, vous n'aurez donc aucun problème inhérent. Cependant, si votre méthode statique accède à un état partagé, tous les paris sont désactivés.

Voici des exemples d’État partagé:

  • champs statiques
  • objets accédés à partir d'un cache commun (non sérialisé)
  • données obtenues via les paramètres d'entrée (et état sur ces objets), s'il est possible que plusieurs threads touchent le même objet

Si vous avez un état partagé, vous devez soit:

  • veillez à ne pas modifier l'état une fois qu'il peut être partagé (mieux: utilisez des objets immuables pour représenter l'état et prenez un instantané de l'état dans une variable locale - c'est-à-dire plutôt que de faire référence à whatever.SomeData à plusieurs reprises, vous lisez whatever.SomeDatane fois dans une variable locale, puis utilisez simplement la variable - notez que cela n’aide que pour un état immuable!)
  • synchroniser l'accès aux données (tous les threads doivent se synchroniser) - lecteur/graveur s'excluant mutuellement ou (plus granulaire)
88
Marc Gravell

Oui, c'est juste de la chance. ;)

Peu importe que la méthode soit statique ou non, l'important est de savoir si les données sont statiques ou non.

Si chaque thread a sa propre instance distincte de la classe avec son propre ensemble de données, il n'y a aucun risque de confusion des données. Si les données sont statiques, il n'existe qu'un seul ensemble de données et tous les threads partagent les mêmes données. Il n'y a donc aucun moyen de ne pas les mélanger.

Lorsque vos données dans des instances distinctes sont encore mélangées, c'est probablement parce qu'elles ne sont pas vraiment séparées.

23
Guffa

Les méthodes statiques devraient convenir à plusieurs threads.

Les données statiques, d’autre part, peuvent poser problème, car les tentatives d’accès aux mêmes données à partir de différents threads doivent être contrôlées afin de s’assurer qu’un seul thread à la fois lit ou écrit les données.

13
Doug Ferguson

MSDN dit toujours:

Tous les membres statiques publics (partagés dans Visual Basic) de ce type sont thread-safe. Il n'est pas garanti que les membres d'instance soient thread-safe.

Edit: comme le disent les gars ici, ce n'est pas toujours le cas, et cela s'applique clairement aux classes conçues de cette manière dans la BCL, pas aux classes créées par l'utilisateur où cela ne s'applique pas.

7
Marcote