C #: Что делать, если статический метод вызывается из нескольких потоков?

В моем приложении есть статический метод, который вызывается из нескольких потоков одновременно. Есть ли опасность того, что мои данные будут перепутаны?

В моей первой попытке метод не был статичным, и я создавал несколько экземпляров класса. В этом случае мои данные как-то перепутались. Я не уверен, как это происходит, потому что это случается только иногда. Я все еще отлаживаю. Но сейчас метод статичен, у меня пока проблем нет. Может быть, это просто удача. Я не знаю точно.

81 голос | спросил TalkingCode 14 J0000006Europe/Moscow 2010, 17:38:48

3 ответа


0

Переменные, объявленные внутри методов (за исключением, возможно, переменных captured ), изолированы, поэтому проблем не возникает; однако, если ваш статический метод получает доступ к любому общему состоянию, все ставки отключены.

Примеры общего состояния:

  • статические поля
  • доступ к объектам из общего кэша (не сериализованный)
  • данные, полученные с помощью входных параметров (и состояния этих объектов), если возможно, что несколько потоков касаются одного и того же объекта (ов)

Если у вас есть общее состояние, вы должны либо:

  • позаботьтесь о том, чтобы не изменять состояние, как только оно может быть передано (лучше: используйте неизменяемые объекты для представления состояния и делайте снимок состояния в локальную переменную, т.е. вместо ссылки whatever.SomeData, вы читаете whatever.SomeData один раз в локальный переменной, а затем просто используйте переменную - обратите внимание, что это помогает только для неизменного состояния!)
  • синхронизировать доступ к данным (все потоки должны синхронизироваться) - либо взаимоисключающий, либо (более детальный) читатель /писатель
ответил Marc Gravell 14 J0000006Europe/Moscow 2010, 17:44:49
0

Да, это просто удача. ;)

Неважно, является ли метод статическим или нет, важно то, являются ли данные статичными или нет.

Если у каждого потока есть свой отдельный экземпляр класса со своим собственным набором данных, нет риска перепутать данные. Если данные статические, существует только один набор данных, и все потоки используют одни и те же данные, поэтому нет способа не смешивать их.

Когда ваши данные в отдельных экземплярах все еще перепутаны, это, скорее всего, связано с тем, что данные на самом деле не являются отдельными.

ответил Guffa 14 J0000006Europe/Moscow 2010, 17:46:39
0

MSDN всегда говорит:

  

Любые открытые статические (Shared в Visual Basic) члены этого типа являются потокобезопасными. Любые члены экземпляра не гарантируют поточно-ориентированность.

Edit: Как говорят ребята, это не всегда так, и, очевидно, это относится к классам, разработанным таким образом в BCL, а не к классам, созданным пользователем, к которым это не относится.

ответил Marcote 14 J0000006Europe/Moscow 2010, 17:46:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132