共用方式為


取得和釋放語意

如果其他處理器一律會在任何後續作業效果發生前看到其效果,該作業就具備語意特性。 如果其他處理器能在作業本身的效果之前看到每個先前作業的效果,那麼該作業就具有 釋放語義

請思考下列程式碼範例:

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

從另一個處理器的觀點來看,上述作業可能會依任何順序發生。 例如,其他處理器可能會在遞增b之前看到a的增量。

原子操作,例如 InterlockedXxx 例程執行的作業,預設同時具有取得和釋放語義。 不過,以 Itanium 為基礎的處理器在執行只有取得語意或只有釋放語意的作業時,比在執行同時具有兩者語意的作業更快。 因此,系統提供某些 InterlockedXxx 例程的 InterlockedXxxAcquireInterlockedXxxRelease 版本。

例如, InterlockedIncrementAcquire 例程會使用取得語意來遞增變數。 如果您重新撰寫上述程式代碼範例,如下所示:

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

其他處理器一律會先看到a的遞增,再看到bc的增量。

同樣地, InterlockedIncrementRelease 例程會使用發行語意來遞增變數。 如果您再次重新撰寫程式代碼範例,如下所示:

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

其他處理器將會在 c 遞增之前看到 ab 的遞增。

如果處理器未提供只取得或僅釋放語意的指令,則系統會使用提供這兩種語意類型的對應例程。 例如,在 x86 處理器上, InterlockedIncrementAcquireInterlockedIncrementRelease 都相當於 InterlockedIncrement

下表列出具有僅限取得和僅限發行變體的例程。

InterlockedXxx 例程 Acquire-Semantics-Only 版本 Release-Semantics-Only 版本

InterlockedIncrement

InterlockedIncrementAcquire

InterlockedIncrementRelease

InterlockedDecrement

InterlockedDecrementAcquire

InterlockedDecrementRelease

InterlockedCompareExchange

InterlockedCompareExchangeAcquire

InterlockedCompareExchangeRelease