2012-02-16 3 views
1

Я видел некоторый повторный код (методы, если быть точным), где они входят в критический раздел, а затем с помощью InterlockedExchange ... Это имеет смысл, поскольку я думал, что эта операция была интактной атомной и не требовала такой синхронизации?InterlockedExchange (или аналогичная атомная операция) в критическом разделе?

{ 
    EnterCricSectionLock lock (somelock); 
    InterlockedExchange(&somelong, static_cast<long>(newlongVal)); 
} 

Это в основном то, что есть ...

ответ

1

Нормальный обмен, как правило, не является атомарным. Тем не менее, это нормально, если вы владеете мьютексом, если все остальные виды использования защищены одним и тем же мьютексом. Также хорошо использовать атомный обмен, если все остальные применения являются атомарными. Единственная логическая причина, по которой я могу думать об атомном обмене, имея при себе мьютекс, заключается в том, что не все его использование защищено мьютексом.

+0

Является ли «не» атомным? [MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683590 (v = vs.85) .aspx): «Устанавливает 32-разрядную переменную в указанное значение как атомную операция «. Конечно, вы говорите о «всех других пользователях»: все они должны также использовать функцию блокировки. –

+0

Атомный обмен, конечно, атомный. Я имел в виду, что нормальный обмен обычно не является атомарным. – rasmus

+0

ОК, извините за недоразумение (но поскольку вопрос касался, в частности, 'InterlockedExchange', я не чувствую к нему плохого ;-) –

1

Для одиночной атомной операции не потребуется CS, но она может действовать как забор, чтобы все что-либо изменилось, когда блокировка удерживается в глобальном масштабе (IIRC, явные заграждения для SSE2 +, но блокировка ops не нужна SSE на всех), однако тогда должен быть в любых глобальных магазинах.

Если это имеет смысл, так это то, что CS используется для блокировки доступа к чему-то другому, и, таким образом, глобальное обмене не является частью блокировки.

+0

Согласно [MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683590 (v = vs.85) .aspx), он «генерирует полный барьер памяти (забор)». Поэтому я предполагаю, что не обязательно использовать CS в дополнение к блокированному оператору. +1 для примечания об этом, вероятно, является частью «большего» инварианта для защиты с помощью CS. –

+0

@ Christian.K: моя формулировка была немного бедной, сделав ее немного яснее. – Necrolis

Смежные вопросы