Atomic.h在Thread部分作为头文件引入,原因应该是一个单独的线程中值的改变和计算需要原子性,操作在执行过程中不应该被切换,其代码如下
#ifndef MUDUO_BASE_ATOMIC_H
#define MUDUO_BASE_ATOMIC_H
#include <boost/noncopyable.hpp>
#include <stdint.h>
namespace muduo
{
namespace detail
{
template<typename T>
class AtomicIntegerT : boost::noncopyable //不可拷贝的类
{
public:
AtomicIntegerT() : value_(0) //初始化value_值为0
{ }
T get()
{ return __sync_val_compare_and_swap(&value_, 0, 0); } //原子比较操作
T getAndAdd(T x)
{ return __sync_fetch_and_add(&value_, x); } //原子自增操作
T addAndGet(T x)
{ return getAndAdd(x) + x; }
T incrementAndGet()
{ return addAndGet(1); }
T decrementAndGet()
{ return addAndGet(-1); }
void add(T x)
{ getAndAdd(x); }
void increment()
{ incrementAndGet(); }
void decrement()
{ decrementAndGet(); }
T getAndSet(T newValue)
{ return __sync_lock_test_and_set(&value_, newValue); } //原子赋值操作
private:
volatile T value_;
};
}
typedef detail::AtomicIntegerT<int32_t> AtomicInt32;
typedef detail::AtomicIntegerT<int64_t> AtomicInt64;
}
#endif // MUDUO_BASE_ATOMIC_H
什么是原子性操作?
指在多线程编程中,不会被线程调度机制打断的操作,操作一旦开始,就一直运行到结束,中间不会有切换线程的操作。这个功能在muduo库的多线程实现中很重要。