В чем разница между InterlockedCompareExchange Release () и Acquire ()? - PullRequest
6 голосов
/ 19 марта 2012

В чем разница между InterlockedCompareExchangeRelease() и InterlockedCompareExchangeAcquire()?

Когда я пытаюсь изучить функции синхронизации с WIN32 API, я обнаружил, что есть две функции, названные по-разному, но, кажется, делают одно и то же:

LONG __cdecl InterlockedCompareExchangeRelease(
  __inout  LONG volatile *Destination,
  __in     LONG Exchange,
  __in     LONG Comparand
);

и

LONG __cdecl InterlockedCompareExchangeAcquire(
  __inout  LONG volatile *Destination,
  __in     LONG Exchange,
  __in     LONG Comparand
);

Я проверяю MSDN, он говорит, что эти функции:

Выполняет атомарную операцию сравнения и обмена для указанногоценности.Функция сравнивает два указанных 32-разрядных значения и обменивается с другим 32-разрядным значением на основе результата сравнения.

, но для InterlockedCompareExchangeAcquire(),

.операция выполняется с семантикой доступа к памяти.

и для InterlockedCompareExchangeRelease(),

Обмен выполняется с семантикой доступа к памяти освобождения.

Так что мне интересно узнать разницу между этими двумя функциями.Когда использовать получить семантику доступа к памяти или освободить семантику доступа к памяти ?Есть ли примеры?

Спасибо!

Ответы [ 2 ]

9 голосов
/ 19 марта 2012

Обычная версия использует полный барьер, в то время как версии с суффиксом работают только с нагрузками или хранилищ, это может быть быстрее на некоторых процессорах (процессоры на базе Itanium и т. Д.)

MSDN имеетстатья о семантике получения и выпуска и Interlocked * API , а также этом замечательном сообщении в блоге . Документация по барьеру памяти для Linux также может быть полезна ...

1 голос
/ 19 марта 2012

Я обнаружил это и это в MSDN:

Семантика получения памяти указывает, что операция памяти, выполняемая текущим потоком, будет видна долюбые другие операции с памятью предпринимаются.Семантика освобождения памяти указывает, что операция памяти, выполняемая текущим потоком, будет видимой после того, как все другие операции памяти будут завершены.Эта семантика позволяет принудительно выполнять операции с памятью в определенном порядке.Используйте семантику захвата при входе в защищенную область и освобождайте семантику при выходе из нее.

...