目录
什么时原子变量?
atomic 类成员
原子变量的使用
C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
什么时原子变量?
原子操作
原子指的是一系列不被 CPU上下文交换的机器指令,这些指令组合在一起就形成了原子操作。在多核 CPU 下,当某个CPU开始运行原子操作时,会先暂停其它 CPU 内核对内存的操作,以保证原子操作被其它 CPU 内核所干扰。
C++11内置了整形的原子变量:
C++11提供了一个原子类型std::atomic,可以通过这个原子类型管理的内部变量就可以称之为原子变量,我们可以给原子类型指定 bool、char、int、long、指针等类型作为模板参数使用。
在多线程操作中,使用原子变量之后就不需要再使用互斥量来保护该变量了,用起来更简洁。因为对原子变量进行的操作只能是一个原子操作(atomic operation),原子操作指的是不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何的上下文切换。
多线程同时访问共享资源造成数据混乱的原因就是因为 CPU 的上下文切换导致的,使用原子变量解决了这个问题,因此互斥锁的使用也就不再需要了。
atomic 类成员
1. 原子地以 desired 替换当前值。按照 order 的值影响内存。
desired:存储到原子变量中的值
order:强制的内存顺序
void store( T desired, std::memory_order order = std::memory_order_seq_cst ) noexcept;
void store( T desired, std::memory_order order = std::memory_order_seq_cst ) volatile noexcept;
2. 原子地加载并返回原子变量的当前值。按照order的值影响内存。直接访问原子对象也可以得到原子变量的当前值。
T load( std::memory_order order = std::memory_order_seq_cst ) const noexcept;
T load( std::memory_order order = std::memory_order_seq_cst ) const volatile noexcept;
内存顺序约束
typedef enum memory_order {
memory_order_relaxed, // relaxed
memory_order_consume, // consume
memory_order_acquire, // acquire
memory_order_release, // release
memory_order_acq_rel, // acquire/release
memory_order_seq_cst // sequentially consistent
} memory_order;
原子变量的使用
#include <iostream>
#include <thread>
#include <atomic>
#include <functional>
using namespace std;
//std::atomic<int> m_value = 0;//错误初始化
//atomic_int m_value = 0; // 准确初始化
std::atomic<int> m_value(0); // 准确初始化
void increment()
{
for (int i = 0; i < 5; ++i)
{
m_value++;
cout << i <<"increment number: " << m_value << ", theadID: " << this_thread::get_id() << endl;
this_thread::sleep_for(chrono::milliseconds(500));
}
}
void decrement()
{
for (int i = 0; i < 5; ++i)
{
m_value--;
cout << i << "decrement number: " << m_value << ", theadID: " << this_thread::get_id() << endl;
this_thread::sleep_for(chrono::milliseconds(500));
}
}
int main()
{
thread t1(increment);
thread t2(decrement);
t1.join();
t2.join();
return 0;
}