对原子类型的某些操作不一定是线程安全的,比如说
a=a+12;
非线程安全
a+=12;
线程安全
分析如下
Cppreference介绍
成员函数(原子操作)
is_lock_free | |
---|---|
store | 用非原子参数替换原子对象的值 |
load | 获取原子对象的值 |
exchange | 交换两个原子对象的值 |
wait | 阻塞线程,直到收到通知并且原子值发生变化 |
notify_one | 通知至少一个线程在等待原子对象 |
notify_all | 通知所有阻塞的线程等待原子对象 |
特殊的成员函数(原子操作)
fetch_add | 将参数添加到存储在原子对象中的值中,并获取前面保存的值 |
---|---|
fetch_sub | 类似 |
fetch_and | 类似 |
fetch_or | 类似 |
fetch_xor | 类似 |
相关重载运算符(原子操作)
What exactly is std::atomic?
我知道std::atomic<>
是一个原子物体。但是原子能达到什么程度?据我所知,操作可以是原子的。使物体成为原子的确切含义是什么?例如,如果有两个线程同时执行以下代码:
a=a+12;
那么整个操作(比如add_twelve_to(int)
是原子的吗?还是对可变原子进行了更改?
ANSWER:
std::atomic<>
的每个实例化和完全特化表示一种类型,不同的线程可以同时操作(该类型实例),而不会引发未定义的行为:
原子类型的对象是唯一没有数据竞争的c++对象;也就是说,如果一个线程写一个原子对象,而另一个线程从它读取,这种行为是定义良好的。
此外,对原子对象的访问可以建立线程间同步,并按std::memory_order指定的顺序对非原子内存访问进行排序。
std::atomic<>
所包装的操作,在c++11前的时代