114 votes

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

121voto

Marc Gravell Points 482669

Les Variables déclarées à l'intérieur des méthodes (avec l'exception possible de "capturé" variables) sont isolés, de sorte que vous n'aurez pas de problèmes inhérents; toutefois, si votre méthode statique accède à un état partagé, tous les paris sont éteints.

Des exemples de partage d'etat serait:

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

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

  • prenez soin de ne pas la mutation de l'état une fois qu'il peut être partagé (mieux: utiliser des objets immuables pour représenter l'état, et de prendre un instantané de l'état dans une variable locale - c'est à dire plutôt que de référence whatever.SomeData à plusieurs reprises, vous avez bien lu whatever.SomeData une fois dans une variable locale, puis il suffit d'utiliser la variable de noter que cette aide uniquement pour l'état immuable!)
  • synchroniser l'accès aux données (tous les threads doivent synchroniser) - soit mutuellement exclusifs ou (plus de granules) lecteur/graveur

40voto

Guffa Points 308133

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

Il n'a pas d'importance si la méthode est statique ou non, ce qui importe est de savoir si les données sont statiques ou pas.

Si chaque thread a son propre instance de la classe avec son propre jeu de données, il n'y a pas de risque que des données ne soient mélangés. Si les données sont statiques, il n'y a qu'un seul jeu de données, et tous les threads partagent les mêmes données, il n'existe aucun moyen de ne pas les mélanger.

Lors de vos données dans des instances distinctes toujours se mélange, c'est probablement parce que les données ne sont pas vraiment distinctes.

20voto

Doug Ferguson Points 1458

Les méthodes statiques devraient convenir à plusieurs threads.

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

12voto

Markust Points 1686

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X