Можно ли предположить, что изменения, сделанные Interlocked, будут видны во всех потоках?
Это зависит от того, как вы читаете значение. Если вы «просто» прочитали его, то нет, это не всегда будет видно в других потоках, если вы не отметите его как изменчивый. Это вызывает раздражающее предупреждение, хотя.
В качестве альтернативы (и весьма предпочтительного IMO), прочитайте его, используя другую инструкцию по блокировке. Это всегда будет видеть обновленное значение во всех потоках:
int readvalue = Interlocked.CompareExchange(ref counter, 0, 0);
, который возвращает прочитанное значение, и, если оно было 0, заменяет его на 0.
Мотивация: предупреждение намекает, что что-то не так; объединение двух методов (изменчивых и взаимосвязанных) не было предназначенным способом сделать это.
Обновление: похоже, что другой подход к надежному 32-битному чтению без использования volatile - это использование Thread.VolatileRead
, как предложено в этого ответа . Также есть некоторые свидетельства того, что я совершенно не прав в использовании Interlocked
для 32-битных операций чтения, например в этой проблеме Connect , хотя мне интересно, является ли различие немного педантичным по своей природе.
Что я действительно имею в виду: не используйте этот ответ в качестве единственного источника; У меня есть сомнения по этому поводу.