当前位置: 首页 > 工具软件 > Atomic > 使用案例 >

【C++】atomic简介

殷安顺
2023-12-01

atomic简介
C++11起提供了atomic,可以使用它定义一个原子类型。
原型:

template< class T >
struct atomic;


成员函数:
atomic提供了一些与原子操作有关的成员函数。

成员函数说明
store原子地以非原子对象替换原子对象的值
load    原子地获得原子对象的值


详见:https://zh.cppreference.com/w/cpp/atomic/atomic

特化成员函数:
所谓特化函数,也就是atomic提供的,可以进行原子操作的函数。使用这些函数,进行的操作,都是原子的。

特化成员函数 说明
fetch_add原子地将参数加到存储于原子对象的值,并返回先前保有的值
fetch_sub原子地进行参数和原子对象的值的逐位与,并获得先前保有的值
fetch_or原子地进行参数和原子对象的值的逐位或,并获得先前保有的值
fetch_xor原子地进行参数和原子对象的值的逐位异或,并获得先前保有的值
operator++令原子值增加一
operator++(int) 令原子值增加一
operator–令原子值减少一
operator–(int)令原子值减少一
............


详见:https://zh.cppreference.com/w/cpp/atomic/atomic

为什么要定义一个原子类型?
举个例子,int64_t类型,在32位机器上为非原子操作。更新时该类型的值时,需要进行两步操作(高32位、低32位)。如果多线程操作该类型的变量,且在操作时未加锁,可能会出现读脏数据的情况。

解决该问题的话,加锁,或者提供一种定义原子类型的方法。

使用
定义一个原子类型

// 定一个int64_t的原子类型
std::atomic<int64_t> value;


自加操作(原子)

// atomic提供的特化成员函数,已经重载了++运算符
// 所以该操作时原子的
value++



读取变量值(原子)

// 此处的原子,指的是读取value的值,这一步。
// 而不是,将value的值赋给x。

int64_t x = value.load(std::memory_order_relaxed);


更新变量(原子)

int64_t x = 10;
value.store(x,std::memory_order_relaxed)

对于std::memory_order_relaxed 的说明:(C++11多线程 内存序(std::memory_order_relaxed)):

std::memory_order_relaxed在此处可以理解为仅仅保持原子性对于不同的线程,std::memory_order_relaxed内存序不保证读取值的同步,但若同一个线程已经读取到某个值a,则后续的load不能读取到比a更老的值。


参考资料
http://www.cplusplus.com/reference/atomic/atomic/store/
https://zh.cppreference.com/w/cpp/atomic/atomic
————————————————
版权声明:本文为CSDN博主「林多」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zxc024000/article/details/100767211

 类似资料: