备份自Github pages muduo_base 02 (Atomic) pusidun's blog
本文源码基于muduo v2.0.2分析
原子操作
GCC4.1+中的原子操作
muduo用了下面几个(需要加编译选项-march=cpu-type):
//原子自增:返回旧值,原值加value
type __sync_fetch_and_add(type *ptr, type value)
//原子比较和交换操作:if the current value of *ptr is oldval, then write newval into *ptr.
type __sync_val_compare_and_swap(type* ptr, type oldval,type newval)
bool __sync_bool_compare_and_swap(type* ptr, type oldval,type newval)
//原子赋值操作:writes value into *ptr, and returns the previous contents of *ptr
type __sync_lock_test_and_set(type* ptr, type value)
C++11中的原子操作
类图
主要就这2个方法需要关注,其他方法基于这2个方法
T get()
{
// in gcc >= 4.7: __atomic_load_n(&value_, __ATOMIC_SEQ_CST)
return __sync_val_compare_and_swap(&value_, 0, 0);
}
T getAndAdd(T x)
{
// in gcc >= 4.7: __atomic_fetch_add(&value_, x, __ATOMIC_SEQ_CST)
return __sync_fetch_and_add(&value_, x);
}