概念
C++11起提供了atomic,可以使用它定义一个原子类型。
-
为什么要定义一个原子类型?
举个例子,int64_t类型,在32位机器上为非原子操作。更新时该类型的值时,需要进行两步操作(高32位、低32位)。如果多线程操作该类型的变量,且在操作时未加锁,可能会出现读脏数据的情况。 -
解决该问题的话,加锁,或者提供一种定义原子类型的方法。
简单的使用
#include<atomic>
#include<iostream>
int main(){
std::atomic<int64_t> value;//定义一个原子对象
int64_t x=10;
value.store(x);//将x存入该原子对象中
value++;//使用原子对象特化的自增
int64_t y=value.load(std::memory_order_relaxed);//取出原子对象中的值
std::cout<<y<<std::endl;
}
其他原子类型相关操作
特化成员函数 | 说明 |
---|---|
fetch_add | 原子地将参数加到存储于原子对象的值,并返回先前保有的值 |
fetch_sub | 原子地进行参数和原子对象的值的逐位与,并获得先前保有的值 |
fetch_or | 原子地进行参数和原子对象的值的逐位或,并获得先前保有的值 |
fetch_xor | 原子地进行参数和原子对象的值的逐位异或,并获得先前保有的值 |
operator++ | 令原子值增加一 |
operator++(int) | 令原子值增加一 |
operator– | 令原子值减少一 |
operator–(int) | 令原子值减少一 |