三个用于并发编程的组件:
atomic,thread,asio(用于同步和异步io操作)
 

atomic

atomic,封装了不同计算机硬件的底层操作原语,提供了跨平台的原子操作功能,解决并发竞争读写变量的困扰。
包含头文件<boost/atomic.hpp>,

atomic可以把对类型T的操作原子化,T的要求:
1.标量类型,(算数,枚举,指针)
2.只有平凡拷贝/转移构造、赋值和析构函数的类,并且可以使用memcmp执行比操作,通常这样的类都是pod
注:int memcmp(const void *buf1, const void *buf2, unsigned int count);
比较内存区域buf1和buf2的前count个字节。
atomic针对整数类型和指针类型进行特化,增加一些特殊操作。并定义了typedef。

基本操作:
两种方式创建atomic对象:
1、atomic<int> a(10);
assert(a==10);//安全函数,若表达式不成立结束程序
2、atomic<long> L;
cout << L<<endl;//初始值不确定
最重要的两个成员函数:
store()(operator=) 和 load()(operator T())以原子方式存取,不会因为并发访问导致数据不一致。

     boost::atomic<bool> b();
assert(b != );
std::cout << b << std::endl; b.store();//存值
std::cout << b << std::endl; boost::atomic<int> n1();
std::cout << n1.exchange() << std::endl;//交换两个值,并且返回原值100
std::cout << n1 << std::endl; n1 = ;
int n2 = ;
n1.compare_exchange_weak(n2, );//n1 和 n2相比较,相等就输出313,如果不相等 n1 = n2 = 200;
std::cout << n1 << "\t" << n2 << std::endl;
//返回true 或 false 表示原值是否被修改
//区别为weak执行速度快,但有可能执行成功却返回false
n2 = ;
n1 = ;
n1.compare_exchange_strong(n2, );//功能与weak相同
std::cout << n1 << "\t" << n2 << std::endl; //整数atomic用法
boost::atomic<int> n3();
std::cout << n3.fetch_add() << std::endl;//加法操作返回原值
std::cout << n3 << std::endl;
//重载操作符后,都是返回运算后的值
std::cout << n3++ << std::endl;
std::cout << ++n3 << std::endl;
//二进制
//它使用boost.preprocessor预处理元编程工具将一组或多组01数字在编译期展开成为一个八进制数字。每个数字组之间可以用空格分隔,每组可以容纳1个到8个0/1数字。
//这里特别要注意的是,数字组的长度一定不能超过八个,由于预处理器宏展开的限制,嵌套层次太深会导致无法通过编译,报出一大堆错误。
//在编译时展开,没有任何运行时开销
boost::atomic<int> n4{ BOOST_BINARY() };// #include <boost/utility/binary.hpp> //或者 #include <boost/utility.hpp>
auto x = n4.fetch_and(BOOST_BINARY());//逻辑与运算,返回原值n4
std::cout << x << std::endl;
std::cout << n4 << std::endl;

实际上每一个atomic<T>成员函数都有一个memory——order缺省参数,指定了原子操作的内存顺序要求,不允许编译器或者cpu核心为了优化而调整代码或者指令的顺序执行

 

boost并发编程boost::atomic的更多相关文章

  1. 并发编程(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题

    请阅读上篇文章<并发编程实战: POSIX 使用互斥量和条件变量实现生产者/消费者问题>.当然不阅读亦不影响本篇文章的阅读. Boost的互斥量,条件变量做了很好的封装,因此比" ...

  2. 并发编程入门(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题

    请阅读上篇文章<并发编程实战: POSIX 使用互斥量和条件变量实现生产者/消费者问题>.当然不阅读亦不影响本篇文章的阅读. Boost的互斥量,条件变量做了很好的封装,因此比" ...

  3. [Boost基础]并发编程——asio网络库——定时器deadline_timer

    asio库基于操作系统提供的异步机制,采用前摄器设计模式(Proactor)实现了可移植的异步(或者同步)IO操作,而且并不要求使用多线程和锁定,有些的避免了多线程编程带来的诸多有害副作用(如条件竞争 ...

  4. [Boost基础]并发编程——asio网络库——同步socket处理

    网络通信简述 asio库支持TCP,UDP和ICMP通信协议,它在名字空间boost::asio::ip里提供了大量的网络通信方面的函数和类,很好的封装了原始的Berkeley Socket API, ...

  5. [Boost基础]并发编程——asio网络库——异步socket处理

    异步服务器端 #include <conio.h> #include <iostream> using namespace std; #include <boost/as ...

  6. [置顶] 编程模仿boost::function和boost::bind

    boost::function和boost::bind结合使用是非常强大的,他可以将成员函数和非成员函数绑定对一个对象上,实现了类似C#的委托机制.委托在许多时候可以替代C++里面的继承,实现对象解耦 ...

  7. 并发编程(四):atomic

    本篇博客我们主要讲述J.U.C包下的atomic包,在上篇博客"并发模拟"的最后,我们模拟高并发的情形时出现了线程安全问题,怎么解决呢?其实解决的办法有很多中,如直接在add()方 ...

  8. 并发编程(一)—— volatile关键字和 atomic包

    本文将讲解volatile关键字和 atomic包,为什么放到一起讲呢,主要是因为这两个可以解决并发编程中的原子性.可见性.有序性,让我们一起来看看吧. Java内存模型 JMM(java内存模型) ...

  9. Boost多线程编程

    Boost多线程编程   背景 •       今天互联网应用服务程序普遍使用多线程来提高与多客户链接时的效率:为了达到最大的吞吐量,事务服务器在单独的线程上运行服务程序: GUI应用程序将那些费时, ...

随机推荐

  1. Ubuntu美化及配置,常见问题解决方案

    安装符合审美观,并且具有可用性的Ubuntu桌面,需要耗费一些时间与精力不过,相信我,这值得去做,你会享受这中间的过程,以及最后的成果 首先,我推荐安装的软件列表如下,在安装前,需要先执行以下的步骤: ...

  2. 2019 A类

  3. 使用Synchronized块同步方法

    synchronized关键字有两种用法.第一种就是在<使用Synchronized关键字同步类方法>一文中所介绍的直接用在方法的定义中.另外一种就是synchronized块.我们不仅可 ...

  4. Linux学习笔记05—文件与目录权限

    1. 绝对路径与相对路径绝对路径:路径的写法一定由根目录 ‘/’写起,例如 /usr/local/mysql 这就是绝对路径相对路径:路径的写法不是由根目录 ‘/’写起,例如:首先用户进入到/, 然后 ...

  5. ASP.NET Core 中的框架级依赖注入

    https://tech.io/playgrounds/5040/framework-level-dependency-injection-with-asp-net-core 作者: Gunnar P ...

  6. asp.net MVC 中 Session统一验证的方法

    验证登录状态的方法有:1  进程外Session   2 方法过滤器(建一个类继承ActionFilterAttribute)然后给需要验证的方法或控制器加特性标签 3 :新建一个BaseContro ...

  7. 基于设备树的controller学习(1)

    作者 彭东林pengdonglin137@163.com 平台 TQ2440Linux-4.10.17 概述 在设备树中我们经常见到诸如"#clock-cells"."# ...

  8. lufylegend:文本、鼠标事件、键盘事件

    1.文本 <script type="text/javascript">init(50,"mylegend",500,350,main);funct ...

  9. 清除数据库表、外键、存储过程SQL

    1.删除所有外键 )    begin         exec(@c1)        fetchnextfrom c1 into@c1    endclose c1deallocate c1 2. ...

  10. Raspbian 中国软件源

    转自:http://shumeipai.nxez.com/2013/08/31/raspbian-chinese-software-source.html 花了些时间整理了目前最新的树莓派中国大陆地区 ...