2010-04-27 16 views
3

本文:Lock-Free Data Structurespdf)以下「比較和交換」根本所示:無鎖的數據結構++比較並交換日常

template <class T> 
bool CAS(T* addr, T exp, T val) 
{ 
    if (*addr == exp) 
    { 
    *addr = val; 
    return true; 
    } 
    return false; 
} 

然後說

的整個程序是原子的

但這是怎麼回事?其他演員是否有可能在if與作業之間更改addr的值?在這種情況下,假設所有的代碼都使用CAS的基本原則,那麼下次發現某種「預料」它是某種方式時,會發現它不是。然而,這並沒有改變它可能發生的事實,在這種情況下,它還是原子嗎?另一位演員迴歸真實的情況如何,即使這種變化被這位演員所覆蓋?如果這不可能發生,那爲什麼?

我想相信作者,所以我在這裏想念什麼?我認爲這一定很明顯。如果這看起來微不足道,我提前道歉。

回答

8

他正在描述一個由實現給出的原子操作,「以某種方式」。這是用硬件實現的一些僞代碼。

+1

是的,作者聲稱操作是原子操作,然後給你一些代碼,讓你明白它的作用。一個實現(即原子)是Microsoft的InterlockedCompareExchange()(請參閱http://msdn.microsoft.com/en-us/library/ms683560(VS.85).aspx)。如果你只是編譯代碼,那肯定不是原子的。 – 2010-04-27 22:59:54

+0

有了GCC,你有類似的原子操作符,包括CAS在這裏描述:http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html – Timo 2011-08-25 21:56:09