版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/hffhjh111/article/details/53140769
此系列基于Boost库多线程,但是大部分都在C++11中已经实现,所以两者基本一致。没什么特殊要求,练手还是C++11吧,方便不用配置。
PS:Boost不愧为C++准标准库。
本来不打算写,毕竟都是书上的内容,但是后来发现查书太麻烦,所以动手写了这个系列,帮助我只看代码使用多线程。
才疏学浅,如有错误,请多多指教。:-D
Atomic-原子操作(不可中断操作)
//Boost
#include <boost/atomic.hpp>
Using namespace boost;
//C++11
#include <atomic>
using namespace std;
实现:
通过一个Atomic<>泛型类来定义了一系列关于该值的原子操作,
这些原子操作不可被打断。
原子操作数最好在初始化时赋值,否在并发时会发生不可预知的错误。
用处:
其优秀的重载,使其在多CPU并发中可安全访问,可担当计数器或者标志位的角色,还可以用作其他。
关于该值的操作是不可中断的,所以该怎么用看情况即可。
Code:
- #include<iostream>
- #include<boost/atomic.hpp>
- #include<boost/utility/binary.hpp>
- using namespace std;
- using namespace boost;
-
- atomic<int> a(10);
- //assert(a.fetch_add(10) == 10);
- //assert(a == 10);
- assert(++a == 11);
- assert(a++ == 11);
- cout << a.load() << endl;
-
-
- atomic<int> b{BOOST_BINARY (1101)};
- auto x = b.fetch_and(BOOST_BINARY(0110));//逻辑与
- assert(x == BOOST_BINARY(1101) && b == BOOST_BINARY(0100));//b = 0100
- assert(b |= BOOST_BINARY(0100) == BOOST_BINARY(1101)); // b = 1101
- cout << b.load() << endl;
-
-
- atomic<bool> c{ true };
- //atomic<bool> c( true );
- assert(c);
- c = false;
- assert(!c.load());
- auto xx = c.exchange(true);
- cout << xx << endl;
- assert(b && !xx);
关于并发顺序一致性:
多CPU并发中,编译器与CPU的优化都可能打乱指令执行顺序,虽然可能提高效率,但有时我们并不想要这样子(代码不按照我们所想顺序而执行)。
Atomic库在<boost/memory_order.hpp>中定义内存访问顺序概念。
C++11有更多定义,也更底层!