Я читаю пост Джо Даффи о Volatile reads and writes, and timeliness, и я пытаюсь понять что-то о последнем примере кода в пост:Использует ли Interlocked.CompareExchange барьер памяти?
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.
Стоит упомянуть, что он обеспечивает FULL FENCE, а не половину забора. –