Когда я должен спросить себя, является ли мой метод потокобезопасным или нет? - PullRequest
1 голос
/ 22 сентября 2009

Когда мне следует принять во внимание, является ли мой метод поточно-ориентированным или нет?

Спасибо.

Ответы [ 5 ]

3 голосов
/ 22 сентября 2009

спросить: «Можно ли передавать данные в разные потоки?»

в частности:

"Может ли экземпляр быть общим для всех потоков?" msgstr "можно ли разделять статические данные между потоками?"

также для определения отношения между константными / неконстантными методами:

"делает ли мутирующий метод недействительным инварианты класса во время его выполнения?"

Один из способов думать об этом последнем вопросе -

Может ли конструктор копирования работать в ЛЮБОЕ время В ТЕЧЕНИЕ / ПЕРЕКРЫТИЕ Выполнение метода мутации и все еще иметь действительный построенный объект?

(бывают случаи - сразу же приходит на ум статистика производительности - когда данные - это просто данные, а если подсчет обостряется [я НЕ говорю не о проблеме дингинга, здесь только взаимодействие с чтением] за один интервал или следующее, это не имеет значения. Поэтому метод мутации (dinging) не нужно сериализовать методом копирования)

Конечно, вам также нужно подумать о взаимодействии метода мутации с методами мутации.

2 голосов
/ 22 сентября 2009

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

1 голос
/ 22 сентября 2009

В C # мы обнаружили, что удаленные объекты, созданные с помощью Singleton, не являются потокобезопасными, поэтому вам необходимо убедиться, что в вашем классе / методах вы учитываете это.

1 голос
/ 22 сентября 2009

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

0 голосов
/ 22 сентября 2009

Есть два случая:

Ваша работа будет в преимущественно однопоточной среде. Спросите себя «есть ли шанс, что это можно назвать чем-то многопоточным?».

Ваша работа будет в преимущественно многопоточной среде. Задайте себе вопрос: «Могу ли я доказать, что этот вызов будет вызываться только из одного потока? Или, чуть слабее, могу ли я доказать, что он будет вызываться только при гарантии эксклюзивности?»

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

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