3
本文:Lock-Free Data Structures(pdf)以下「比較和交換」根本所示:無鎖的數據結構++比較並交換日常
template <class T>
bool CAS(T* addr, T exp, T val)
{
if (*addr == exp)
{
*addr = val;
return true;
}
return false;
}
然後說
的整個程序是原子的
但這是怎麼回事?其他演員是否有可能在if
與作業之間更改addr
的值?在這種情況下,假設所有的代碼都使用CAS的基本原則,那麼下次發現某種「預料」它是某種方式時,會發現它不是。然而,這並沒有改變它可能發生的事實,在這種情況下,它還是原子嗎?另一位演員迴歸真實的情況如何,即使這種變化被這位演員所覆蓋?如果這不可能發生,那爲什麼?
我想相信作者,所以我在這裏想念什麼?我認爲這一定很明顯。如果這看起來微不足道,我提前道歉。
是的,作者聲稱操作是原子操作,然後給你一些代碼,讓你明白它的作用。一個實現(即原子)是Microsoft的InterlockedCompareExchange()(請參閱http://msdn.microsoft.com/en-us/library/ms683560(VS.85).aspx)。如果你只是編譯代碼,那肯定不是原子的。 – 2010-04-27 22:59:54
有了GCC,你有類似的原子操作符,包括CAS在這裏描述:http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html – Timo 2011-08-25 21:56:09