muduo_base 02 (Atomic)

本文源码基于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)

更多的GCC手册Atomic-Builtins

C++11中的原子操作

cppreference atomic

类图

Atomic

主要就这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);
}

参考阅读

coolshell-无锁队列的实现