Правила поиска / исключения общих данных в многопоточном приложении - PullRequest
2 голосов
/ 06 марта 2009

Hy,

как мы все знаем, разработка многопоточного приложения - сложная задача. Тем более, что момент, когда и что блокировать, не так очевиден, ИМХО. Часто я смотрю на метод / класс, и я должен спросить себя, делюсь ли я некоторыми данными, которые могут быть изменены несколькими потоками. И когда я не уверен, что это заканчивается блокировкой () для всего блока кода.

Итак, что мне нравится знать: есть ли у вас предложения по шаблонам / правилам и т. Д. Для идентификации общих данных? Или методы, гарантирующие, что ваш код является поточно-ориентированным.

например:.

  • Статические методы не должны изменять поля класса. (Если они не блокируют поле.)
  • Параметры метода, относящиеся к типу ссылки, не должны передаваться "напрямую". Всегда передавайте клона.

Кстати:

Microsoft Research работает над ШАХМАТЫ . Инструмент для поиска и воспроизведения Heisenbugs в параллельных программах. Я надеюсь, что это и PLINQ улучшат разработку параллельных программ.

Ответы [ 2 ]

3 голосов
/ 06 марта 2009

Где возможно, сделайте ваши типы неизменными для начала. Тогда нет необходимости клонировать. Если вам нужно «изменить» содержимое объекта, сделайте так, чтобы метод возвращал новый объект, как это делает String.Replace и т. Д.

Это в основном стиль функционального программирования, и это прекрасно. К сожалению, у нас (в настоящее время) нет неизменяемых коллекций, встроенных в .NET Framework, хотя существуют сторонние, , включая одну из наших JaredPar .

0 голосов
/ 06 марта 2009

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

Кроме того, у вас есть где-то поместить личную переменную, которую вы можете использовать в качестве идентификатора блокировки, чтобы вы могли избежать использования самих данных в качестве идентификатора для блокировки. Имея личную переменную, выделенную в качестве идентификатора блокировки, вы удаляете один из возможных источников тупиковых ситуаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...