三个用于并发编程的组件:
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. 002.SSH日常命令

    一 远程登陆 ssh 用户名@远程主机ip:首次登陆需要下载对方公钥. 实例:ssh 192.168.10.129 二 远程复制 scp root@远程主机ip:[远程主机文件绝对路径] [需要保存的 ...

  2. oracle批量插入優化方案

    今天聽DBA説如果從一個表批量查詢出一批數據之後批量插入另外一張表的優化方案: 1)不寫歸檔日誌: 2)採用獨佔 關於insert /*+ append */我們需要注意以下三點: a.非歸檔模式下, ...

  3. [TC13761]Mutalisk

    [TC13761]Mutalisk 题目大意: 有\(n(n\le20)\)个坏人,第\(i\)个坏人的血量为\(A_i(A_i\le60)\).你可以每次攻击\(3\)个坏人,并分别造成\(9\)点 ...

  4. Python包管理工具pip安装

    Python版本在2.7.9+以上的都自带pip无需安装,但在CentOS 7里面自带的Python是2.7.5,所以需要单独安装. 安装: curl https://bootstrap.pypa.i ...

  5. <label>标签引起的Firefox焦点问题

    在使用Dreamweaver做页面form的时候,默认情况下Dreamweaver都会生成一个<label>标签把元素包装一下,但是有事由于包装不好也会出现一些问题,例如我现在遇到的问题: ...

  6. 用delphi检查网络连接状态3种方式

    用delphi检查网络连接状态3种方式 用delphi检查网络连接状态 检测计算机是否联网比较简单的做法可以通过一个 Win32 Internet(WinInet) 函数 InternetCheckC ...

  7. ASP.NET MVC中使用Session来保持表单的状态

    本篇实践在ASP.NET MVC 4下使用Session来保持表单的状态. 本篇的源码在这里: https://github.com/darrenji/KeepFormStateUsingSessio ...

  8. rawbytestring

    rawbytestring Delphi 定义了 RawByteStrng 类型的字符串,定义如下: RawByteString = type AnsiString($ffff); 关于RawByte ...

  9. 论DELPHI三层的数据序列格式的变化

    论DELPHI三层的数据序列格式的变化 要窥三层的数据序列格式,我们可以通过观察DELPHI官方的客户端内存表. 早先流行的是TClientDataSet,它的Data和Delta属性的数据类型都是: ...

  10. ExtJS学习-----------Ext.Array,ExtJS对javascript中的Array的扩展(实例)

    (1)clean var arr = [1,2,null,3,'']; alert(Ext.Array.clean(arr)); //clean的对象:(value === null) || (val ...