交易系统开发技能及面试之无锁编程(Lock-free)

概要

这一章内容主要讲解无锁编程相关技能,在生产中,为了解决线程间资源共享问题,最常用的方式就是加锁了,这在上一章并发编程也讲到过很多。关于无锁的时候,也写过一篇无锁队列的实现,而今天这篇文章主要是讲解无锁编程所需要了解的基础知识,比如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&#

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值