Я читаю сообщение Джо Даффи о Неустойчивые чтения и записи и своевременность, и я пытаюсь понять что-то о последнем коде образец в сообщении:
while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;
m_state = 0;
while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;
m_state = 0;
…
Когда выполняется вторая операция CMPXCHG, использует ли она барьер памяти, чтобы гарантировать, что значение m_state действительно является последним значением, написанным на нем? Или он просто использует некоторое значение, которое уже хранится в кеше процессора? (предполагая, что m_state не объявляется изменчивым).
Если я правильно пойму, если CMPXCHG не будет использовать барьер памяти, тогда вся процедура захвата блокировки будет неудовлетворительной, так как очень вероятно, что поток, который первым приобрел блокировку, будет тем, который приобретет все следующие блокировки. Правильно ли я понял, или я что-то пропустил здесь?
Изменить. Главный вопрос: действительно ли вызов CompareExchange вызывает барьер памяти, прежде чем пытаться прочитать значение m_state. Таким образом, независимо от того, будет ли назначение 0 видимым для всех потоков, когда они снова попытаются вызвать CompareExchange.