版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/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有更多定义,也更底层!