首页 > 其他 > 详细

muduo源码分析之Atomic原子性操作

时间:2021-06-06 21:30:45      阅读:19      评论:0      收藏:0      [点我收藏+]

相关文件

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;

muduo源码分析之Atomic原子性操作

原文:https://www.cnblogs.com/Lj-ming/p/14856219.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!