2012-03-19 66 views
6

InterlockedCompareExchangeRelease()InterlockedCompareExchangeAcquire()有什麼區別?InterlockedCompareExchange Release()和Acquire()有什麼區別?

當我嘗試學習用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 
); 

我檢查它說這些功能是:

對指定的指令執行原子比較和交換操作 值。該功能將比較兩個指定的32位值和 與另一個32位值的交換,並根據 比較的結果進行交換。

但對於InterlockedCompareExchangeAcquire()

與獲取存儲器訪問語義執行操作。

InterlockedCompareExchangeRelease()

交換與發行存儲器存取語義進行。

所以我很好奇這兩個功能的區別。 何時使用獲取內存訪問語義釋放內存訪問語義? 有沒有例子?

謝謝!

回答

1

我發現thisthis MSDN上:

採集內存語義指定當前線程正在執行的內存操作的任何其它存儲操作被嘗試之前將是可見的。釋放內存語義指定在所有其他內存操作完成後,當前線程正在執行的內存操作將可見。這些語義允許您強制內存操作按特定順序執行。進入受保護區域時使用獲取語義,並在離開時釋放語義。