如果其他處理器一律會在任何後續作業效果發生前看到其效果,該作業就具備語意特性。 如果其他處理器能在作業本身的效果之前看到每個先前作業的效果,那麼該作業就具有 釋放語義。
請思考下列程式碼範例:
a++;
b++;
c++;
從另一個處理器的觀點來看,上述作業可能會依任何順序發生。 例如,其他處理器可能會在遞增b之前看到a的增量。
原子操作,例如 InterlockedXxx 例程執行的作業,預設同時具有取得和釋放語義。 不過,以 Itanium 為基礎的處理器在執行只有取得語意或只有釋放語意的作業時,比在執行同時具有兩者語意的作業更快。 因此,系統提供某些 InterlockedXxx 例程的 InterlockedXxxAcquire 和 InterlockedXxxRelease 版本。
例如, InterlockedIncrementAcquire 例程會使用取得語意來遞增變數。 如果您重新撰寫上述程式代碼範例,如下所示:
InterlockedIncrementAcquire(&a);
b++;
c++;
其他處理器一律會先看到a的遞增,再看到b和c的增量。
同樣地, InterlockedIncrementRelease 例程會使用發行語意來遞增變數。 如果您再次重新撰寫程式代碼範例,如下所示:
a++;
b++;
InterlockedIncrementRelease(&c);
其他處理器將會在 c 遞增之前看到 a 和 b 的遞增。
如果處理器未提供只取得或僅釋放語意的指令,則系統會使用提供這兩種語意類型的對應例程。 例如,在 x86 處理器上, InterlockedIncrementAcquire 和 InterlockedIncrementRelease 都相當於 InterlockedIncrement。
下表列出具有僅限取得和僅限發行變體的例程。
| InterlockedXxx 例程 | Acquire-Semantics-Only 版本 | Release-Semantics-Only 版本 |
|---|---|---|