У меня есть несколько простых (надеюсь) вопросов, на которые я не смог найти ответы:
Скажем, у меня есть объекты a, b, которые доступны для нескольких потоков.
Interlocked.Exchange(ref a, b)
Если «b» не является изменчивым, будет ли эта операция рассматривать его как таковое? то есть возьмет ли он последнее значение этой переменной из памяти? Если да, то чтение является «атомарным» с записью? Я понимаю, что основная цель Interlocked.Exchange заключается в том, что вы получите предыдущее значение «a» как атомарную операцию с новой записью. Но моя главная путаница связана с тем, какое значение «b» на самом деле записывается в «a».
Мой второй вопрос связан с цитатой из этой статьи:
http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/
«Одним интересным моментом является то, что все записи в C# являются энергозависимыми в соответствии с моделью памяти, описанной здесь и здесь, и также предположительно реализованы как таковые. Спецификация ECMA языка C# на самом деле определяет более слабую модель, в которой записи не являются энергозависимыми по умолчанию. ."
Это правда? Если да, то есть ли цель Interlocked.Exchange, если предыдущее значение «а» не волнует? (относительно моего первого примера). Я не вижу никаких других статей или комментариев на StackOverflow о том, что каждая запись нестабильна. Я понимаю, однако, что записи являются атомарными.
Изменить: если ответ на мой первый вопрос заключается в том, что «b» не рассматривается как изменчивый, а ответ на мой второй вопрос заключается в том, что записи действительно являются изменчивыми, то последующее действие: когда блокируется. обмен полезен, если мы не не заботится о предыдущем значении «а»?
b
не должна иметь значения. - person Henk Holterman   schedule 22.10.2012