用户空间的内存障碍? (Linux、x86-64)
在内核端设置内存屏障很容易:由于 Linux 内核头文件,宏 mb、wmb、rmb 等始终处于适当位置。
在用户端如何实现这一点?
It is easy to set memory barriers on the kernel side: the macros mb, wmb, rmb, etc. are always in place thanks to the Linux kernel headers.
How to accomplish this on the user side?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
您正在寻找 gcc 的完整内存屏障原子内置函数。
请注意我在这里给出的参考资料的详细信息,
You are looking for the full memory barrier atomic builtins of gcc.
Please note the detail on the reference i gave here says,
Posix 定义了许多函数作为内存屏障。 内存位置不得同时访问; 为了防止这种情况,请使用同步 - 并且同步也会充当障碍。
Posix defines a number of functions as acting as memory barriers. Memory locations must not be concurrently accessed; to prevent this, use synchronization - and that synchronization will also work as a barrier.
使用 libatomic_ops。 http://www.hpl.hp.com/research/linux/atomic_ops/
它不是特定于编译器的,并且比 GCC 的 bug 更少。 它不是一个提供大量您不关心的功能的巨型库。 它只提供原子操作。 此外,它还可以移植到不同的 CPU 架构。
Use libatomic_ops. http://www.hpl.hp.com/research/linux/atomic_ops/
It's not compiler-specific, and less buggy than the GCC stuff. It's not a giganto-library that provides tons of functionality you don't care about. It just provides atomic operations. Also, it's portable to different CPU architectures.
Linux x64 意味着您可以使用 Intel 内存屏障指令。
您可以将它们包装在类似于 Linux 头文件中的宏中,如果
这些宏不适合您的代码或您的代码无法访问
Linux x64 means you can use the Intel memory barrier instructions.
You might wrap them in macros similar to those in the Linux headers, if
those macros aren't appropriate or accessible to your code
GCC 4.4+ 中的
__sync_synchronize()
英特尔内存订购白皮书,英特尔 64 和 IA-32 手册第 3A 卷的一部分 http://developer.intel.com/Assets/PDF/manual/253668.pdf
__sync_synchronize()
in GCC 4.4+The Intel Memory Ordering White Paper, a section from Volume 3A of Intel 64 and IA-32 manual http://developer.intel.com/Assets/PDF/manual/253668.pdf
Qprof 分析库(与 Qt 无关)还在其源代码中包含一个原子操作库,包括内存屏障。 它们适用于许多编译器和架构。 我正在我的一个项目中使用它。
http://www.hpl.hp.com/research/linux/qprof /download.php4
The Qprof profiling library (nothing to do with Qt) also includes in its source code a library of atomic operations, including memory barriers. They work on many compilers and architectures. I'm using it on a project of mine.
http://www.hpl.hp.com/research/linux/qprof/download.php4
最近的 Qt 发行版的
include/arch/qatomic_*.h
标头包含许多架构和各种内存屏障(获取、释放,两者)的 (LGPL) 代码。The
include/arch/qatomic_*.h
headers of a recent Qt distribution include (LGPL) code for a lot of architectures and all kinds of memory barriers (acquire, release, both).只需借用为 Linux 内核定义的屏障,只需将这些宏添加到头文件中: http://lxr.linux.no/#linux+v3.6.5/arch/x86/include/asm/barrier.h#L21 。 当然,要在源代码中给予 Linux 开发人员信任。
Simply borrowing barriers defined for Linux kernel, just add those macros to your header file: http://lxr.linux.no/#linux+v3.6.5/arch/x86/include/asm/barrier.h#L21 . And of course, give Linux developers credit in your source code.