之前在实现基于共享内存的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修饰符就能完成可见性。