- 論壇徽章:
- 2
|
我知道gcc提供了如下內(nèi)建函數(shù),
__sync_bool_compare_and_swap, 在x86上會(huì)編譯成 lock cmpxchg指令
可對(duì)內(nèi)存進(jìn)行原子訪問。
這個(gè)函數(shù)的原型是
bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)
type是整數(shù),比如int。
如果用C來表示這個(gè)函數(shù)做的事情,應(yīng)該是這樣的:
- bool __sync_bool_compare_and_swap(int* ptr, int oldval, int newval) {
- if (*ptr == oldval) {
- *ptr = newval;
- return true;
- } else return false;
- }
復(fù)制代碼 這也是通常的CAS實(shí)現(xiàn)的語義。這個(gè)函數(shù)可以用來實(shí)現(xiàn)無鎖。
在C++11中,有一個(gè)atomic庫,里面的atomic<T>模板類,
其中有方法叫 compare_exchange_weak/strong.
關(guān)于weak和strong的差別我理解了,可以看這里 http://www.cplusplus.com/referen ... are_exchange_strong。
我的問題是,這個(gè)方法的語義看起來和 CAS不太一樣。
這個(gè)方法的運(yùn)行結(jié)果用C表示大概是這樣的:
- bool atomic_compare_exchange(int* ptr, int* oldval, int newval) {
- if (*ptr == *oldval) {
- *ptr = newval;
- return true;
- } else {
- *oldval = *ptr;
- return false;
- }
- }
復(fù)制代碼 我看了后很困惑,我查了一些資料,也是說這個(gè)方法是用來實(shí)現(xiàn)無鎖的,通常放在一個(gè)while中循環(huán)直到返回true.
問題是,這個(gè)方法如果第一次調(diào)用是false的話,第二次調(diào)用肯定是true了。
|
|