InterlockedExchange (или аналогичная атомарная операция) в критическом разделе? - PullRequest
1 голос
/ 16 февраля 2012

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

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

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

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

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

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

1 голос
/ 16 февраля 2012

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

...