针对原子性操作进行封装, 下面是我们需要用到的原子操作函数,
有需要对此类进行扩展的话,可以根据下面的函数进行扩展.
原子操作需要加上一个编译选项
-march=i386(根据你CPU 的类型来写,也可以设置native 默认的体系结构)
//先获取再操作
type __sync_fetch_and_add (type *ptr, type value, ...) type __sync_fetch_and_sub (type *ptr, type value, ...) type __sync_fetch_and_or (type *ptr, type value, ...) type __sync_fetch_and_and (type *ptr, type value, ...) type __sync_fetch_and_xor (type *ptr, type value, ...) type __sync_fetch_and_nand (type *ptr, type value, ...) //先操作再获取 type __sync_add_and_fetch (type *ptr, type value, ...) type __sync_sub_and_fetch (type *ptr, type value, ...) type __sync_or_and_fetch (type *ptr, type value, ...) type __sync_and_and_fetch (type *ptr, type value, ...) type __sync_xor_and_fetch (type *ptr, type value, ...) type __sync_nand_and_fetch (type *ptr, type value, ...)
bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)
type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)
上面的是原子比较和设置操作, 一个是返回bool类型,一个是type类型, 有点不同.
基本操作过程如下
1. 判定*ptr 和 oldval是否相等
2.如果相等 *ptr = newval, 返回的是oldval
3.如果不相等 直接返回 *ptr.
其实也就是返回最初的*ptr的值.
bool的话如下
1.判定*ptr和oldval是否相等
2.相等*ptr = newval, 返回true
3.不相等 不设置返回false
上述操作可以实现无锁队列.
无锁对列传送门: http://coolshell.cn/articles/8239.html
有时间可能会自己实现以下
#ifndef ATMOIC_H #define ATMOIC_H #include <atomic> template<typename T> class Atmoic { public: Atmoic(){} T value() { , ); } static bool CompareAndSwap(T& value, T& oldval, T& newval) { return __sync_bool_compare_and_swap(value, oldval, newval); } // n ++ T FetchAndAdd(T x) { return __sync_fetch_and_add(&value_, x); } T FetchAddSub(T x) { return __sync_fetch_and_add(&value_, -x); } T GetAndSet(T x) { return __sync_lock_test_and_set(&value_, x); } private: volatile T value_; }; typedef Atmoic<int> AtmoicInt32; typedef Atmoic<long long> AtmoicInt64; #endif // ATMOIC_H