Я читаю сообщение Джо Даффи о Volatile чтения и записи и своевременности, и я пытаюсь понять кое-что о последнем примере кода в сообщении:
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.