在内核端设置内存屏障很容易:由于 Linux 内核头文件,宏 mb、wmb、rmb 等始终存在。
如何在用户端做到这一点?
在内核端设置内存屏障很容易:由于 Linux 内核头文件,宏 mb、wmb、rmb 等始终存在。
如何在用户端做到这一点?
您正在寻找gcc的完整内存屏障原子内置函数。
请注意我在这里给出的参考资料的详细信息,
[以下] 内置函数旨在与Intel Itanium 处理器特定的应用程序二进制接口第 7.4 节中描述的那些兼容。因此,它们偏离了使用“__builtin_”前缀的正常 GCC 实践,并且它们被重载以便它们可以在多种类型上工作。
Posix定义了许多函数作为内存屏障。内存位置不得同时访问;为了防止这种情况,请使用同步 - 同步也将作为障碍。
使用 libatomic_ops。 http://www.hpl.hp.com/research/linux/atomic_ops/
它不是特定于编译器的,并且比 GCC 的东西少错误。它不是一个提供大量您不关心的功能的巨型库。它只是提供原子操作。此外,它可以移植到不同的 CPU 架构。
Linux x64 意味着您可以使用 Intel 内存屏障指令。如果这些宏不适合您的代码或无法访问您的代码,您可以将它们包装在类似于 Linux 标头中的宏中
__sync_synchronize()
在 GCC 4.4+
英特尔内存订购白皮书,英特尔 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) 代码。