lockfree ringbuffer queue 总结

之前在实现基于共享内存的lockfree ringbuffer queue时候有几点疑惑的地方,做一个总结。本人能力有限,如果有错误的地方,希望能够指出。

1.多进程中共享的内存和多线程中看见的内存是否一致?

这个问题更多的是linux操作系统的理解,线程和进程其实都是基于clone系统调用生成的KSE,区别在于其共享内存的方式(写时复制)不一样。

2.c++的atmoic在共享内存上的操作?

首先要保证原子变量分配在共享内存之上,c++的内存模型理论上能够work,建议使用gcc bulitin

3.write_index和read_index的可见性?

如果使用pthread的mutex并且设置为pshared,无需考虑其他,多进程模型下全局可见,因为mutex自带全屏障。

如果使用gcc bulitin的原子操作,要注意load 和 store的配对使用,改变write_index要使用sfence,通知其他核心该值已经改变。读取read_index的时候要使用lfence清空核心的invalidqueue。

如果采用volatile标记write_index和read_index,强制核心都从内存加载,性能较差。

 

补充

20210607,最近这些日子看了不少文章,总结下,x86下除了store-load的指令乱序其他都不存在乱序,所以用volatile加上__asm__的m修饰符就能完成可见性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值