![](/img/trans.png)
[英]Atomically incrementing an integer in shared memory for multiple processes on linux x86-64 with gcc
[英]Memory barriers in userspace? (Linux, x86-64)
在内核方面很容易设置内存屏障:由于Linux内核标头,宏mb,wmb,rmb等始终在适当的位置。
如何在用户端做到这一点?
您正在寻找gcc的完整内存屏障原子内建函数。
请注意我在此处提供的参考资料的详细内容,
[以下]内置程序旨在与特定于Intel Itanium处理器的应用程序二进制接口 7.4节中描述的内置程序兼容。 因此,它们背离了使用“ __builtin_”前缀的常规GCC惯例,而且它们过载,从而可以处理多种类型。
使用libatomic_ops。 http://www.hpl.hp.com/research/linux/atomic_ops/
它不是特定于编译器的,并且比GCC的东西少很多错误。 它不是提供大量您不需要关心的功能的千兆库。 它仅提供原子操作。 而且,它可移植到不同的CPU架构。
Linux x64意味着您可以使用Intel内存屏障指令。 如果这些宏不适用于您的代码,则可以将它们包装在类似于Linux标头中的宏中
GCC __sync_synchronize()
英特尔内存订购白皮书,英特尔64和IA-32手册第3A卷的一部分, 网址为http://developer.intel.com/Assets/PDF/manual/253668.pdf
Qprof分析库(与Qt无关)在其源代码中还包括原子操作库,包括内存屏障。 它们适用于许多编译器和体系结构。 我在我的一个项目上使用它。
只需借用为Linux内核定义的障碍,只需将这些宏添加到头文件中即可: http : //lxr.linux.no/#linux+v3.6.5/arch/x86/include/asm/barrier.h#L21 。 当然,还要让Linux开发人员相信您的源代码。
最近的Qt发行版的include/arch/qatomic_*.h
标头包含用于许多体系结构和各种内存屏障(获取,发布,两者)的(LGPL)代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.