Семантика получения и выпуска

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

Рассмотрим следующий пример кода.

 a++;
 b++;
 c++;

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

Атомарные операции, например те, которые выполняются подпрограммами InterlockedXxx , по умолчанию имеют как семантику получения, так и освобождения. Однако процессоры на основе Itanium выполняют операции, которые имеют только семантику получения или освобождения быстрее, чем те, которые имеют и то, и другое. Таким образом, система предоставляет версии interlockedXxxAcquire и InterlockedXxxRelease некоторых подпрограмм InterlockedXxx .

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

 InterlockedIncrementAcquire(&a);
 b++;
 c++;

другие процессоры всегда будут видеть приращение a до приращения b и c.

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

 a++;
 b++;
 InterlockedIncrementRelease(&c);

другие процессоры всегда будут видеть приращения a и b до приращения c.

Если процессор не предоставляет инструкции, имеющие только семантику получения или выпуска, система будет использовать соответствующую подпрограмму, которая предоставляет оба типа семантики. Например, на процессорах x86 и InterlockedIncrementAcquire , и InterlockedIncrementRelease эквивалентны InterlockedIncrement.

В следующей таблице перечислены подпрограммы, имеющие варианты только для получения и выпуска.

ПодпрограммаInterlocked Xxx Версия только для получения семантики Версия только семантики выпуска

InterlockedIncrement

InterlockedIncrementAcquire

InterlockedIncrementRelease

InterlockedDecrement

InterlockedDecrementAcquire

InterlockedDecrementRelease

InterlockedCompareExchange

InterlockedCompareExchangeAcquire

InterlockedCompareExchangeRelease