zoukankan      html  css  js  c++  java
  • boost并发编程boost::atomic

    三个用于并发编程的组件:
    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())以原子方式存取,不会因为并发访问导致数据不一致。

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

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

     
  • 相关阅读:
    翻译:实时通信协议UDP-RT——Michael Pan
    翻译:为DAW优化Windows
    翻译:Windows and Real-Time——Daniel Terhell
    笔记4:IIS6发布网站后“对XX路径的访问被拒绝”
    杂记3:VS使用Web Deploy一键发布网站到服务器
    杂记2:VS2013创建Windows服务实现自动发送邮件
    杂记1:不安装Oracle客户端远程连接Oracle的方法
    DevExpress随笔系列
    DevExpress(5): ASPxUploadControl上传照片后用ASPxBinaryImage展示
    DevExpress(4): ASPxGridView随笔
  • 原文地址:https://www.cnblogs.com/fnlingnzb-learner/p/10334945.html
Copyright © 2011-2022 走看看