muduo/base/Atomic.h //AtomicIntegerT类封装
muduo/base/tests/Atomic_unitest.cc //测试示例
保证线程安全。
为什么需要原子性操作?
如两个线程同时执行x++,需要先从内存读x的值到寄存器中,对寄存器加一,再把新值写回x所处的内存地址。可见这个过程是有可能被打断的。
如果两线程同时执行x++,有可能就像图一个结果x只增加了1。
原子性操作保证一个线程对变量操作时其他线程不能对这个变量操作。
直接看muduo提供得测试示例
#include "muduo/base/Atomic.h"
#include <assert.h>
int main()
{
{
muduo::AtomicInt64 a0; //64位整数
assert(a0.get() == 0); //取值
assert(a0.getAndAdd(1) == 0);//先取后加1
assert(a0.get() == 1);//变为1
assert(a0.addAndGet(2) == 3);//先加后取值,等于3
assert(a0.get() == 3);
assert(a0.incrementAndGet() == 4);//加1后取值
assert(a0.get() == 4);
a0.increment();
assert(a0.get() == 5);
assert(a0.addAndGet(-3) == 2);
assert(a0.getAndSet(100) == 2);
assert(a0.get() == 100);
}
{
muduo::AtomicInt32 a1; //32位整数
assert(a1.get() == 0);
assert(a1.getAndAdd(1) == 0);
assert(a1.get() == 1);
assert(a1.addAndGet(2) == 3);
assert(a1.get() == 3);
assert(a1.incrementAndGet() == 4);
assert(a1.get() == 4);
a1.increment();
assert(a1.get() == 5);
assert(a1.addAndGet(-3) == 2);
assert(a1.getAndSet(100) == 2);
assert(a1.get() == 100);
}
}
其中AtomicInt64和AtomicInt32是模板类AtomicIntegerT的类模板。
//muduo/base/Atomic.h
typedef detail::AtomicIntegerT<int32_t> AtomicInt32;//32位整数
typedef detail::AtomicIntegerT<int64_t> AtomicInt64;
原文:https://www.cnblogs.com/Lj-ming/p/14856219.html