目录
概要
这一章内容主要讲解无锁编程相关技能,在生产中,为了解决线程间资源共享问题,最常用的方式就是加锁了,这在上一章并发编程也讲到过很多。关于无锁的时候,也写过一篇无锁队列的实现,而今天这篇文章主要是讲解无锁编程所需要了解的基础知识,比如atomics,内存模型,内存排序等等。
Q1 什么是atomic?
std::atomic<T> x;
以上代码采用标准库的atomic类型声明了一个T类型的原子变量x。在计算机指令执行过程中,一个变量的改变包含 加载(load),更新(update)和 存储(store)3个步骤,原子变量的改变意味着这3个步骤的中间态不会被其他线程所见,避免了普通变量指令乱序带来的非意料操作。
Q2 alignas 关键字
cpu(32位)在一个时钟周期可以读取4个连续的内存单元,即4字节。使用字节对齐将会提高系统的性能,比如将一个int(4个字节)放在奇数内存位置上时,需要两个时钟周期才能读取完,而如果数据用4字节对齐之后,只需要一次就可以读取出来
以下为alignas的用法
alignas(32) long long a = 0;
#define XX 1
struct alignas(XX) MyStruct {
};
template <size_t YY = 1>
struct alignas(YY) MyStruct {
};
static const unsigned zz = 1;
struct alignas(ZZ) MyStruct {
};
//char用int的方式对齐
alignas(int) char c;
alignas只能改大的值,而不能改小,需改小时可采用 #pragma pack 或者 _Pragma(微软暂不支持)
_Pragma("pack(1)")
struct MyStruct {
char a;
int b;
short c;
long long d;
char e;
};
_Pragma("pack()")
Q3 C++的内存模型 relaxed ordering, release-acquire ordering, sequentially consistent ordering
关于c++的内存模型,分为三种: relaxed ordering(松弛次序)、acquire-release ordering(获取-释放次序)、sequentially consistent ordering(顺序一致次序),C++11 提供了6种操作(memory_order_relaxed, memory_order_consume, memory_order_acquire, memory_order_reelase, memory_order_acq_rel, memory_order_seq_cst)
relaxed ordering&#