18

在内核端设置内存屏障很容易:由于 Linux 内核头文件,宏 mb、wmb、rmb 等始终存在。

如何在用户端做到这一点?

4

8 回答 8

6

您正在寻找gcc的完整内存屏障原子内置函数。

请注意我在这里给出的参考资料的详细信息,

[以下] 内置函数旨在与Intel Itanium 处理器特定的应用程序二进制接口第 7.4 节中描述的那些兼容。因此,它们偏离了使用“__builtin_”前缀的正常 GCC 实践,并且它们被重载以便它们可以在多种类型上工作。

于 2009-07-26T17:33:57.817 回答
6

Posix定义了许多函数作为内存屏障。内存位置不得同时访问;为了防止这种情况,请使用同步 - 同步也将作为障碍。

于 2009-07-26T17:44:07.920 回答
4

使用 libatomic_ops。 http://www.hpl.hp.com/research/linux/atomic_ops/

它不是特定于编译器的,并且比 GCC 的东西少错误。它不是一个提供大量您不关心的功能的巨型库。它只是提供原子操作。此外,它可以移植到不同的 CPU 架构。

于 2012-02-20T08:26:15.283 回答
2

Linux x64 意味着您可以使用 Intel 内存屏障指令。如果这些宏不适合您的代码或无法访问您的代码,您可以将它们包装在类似于 Linux 标头中的宏中

于 2009-07-26T17:50:54.397 回答
2

__sync_synchronize()在 GCC 4.4+

英特尔内存订购白皮书,英特尔 64 和 IA-32 手册第 3A 卷的一部分http://developer.intel.com/Assets/PDF/manual/253668.pdf

于 2010-04-04T04:01:36.897 回答
2

Qprof 分析库(与 Qt 无关)还在其源代码中包含一个原子操作库,包括内存屏障。他们适用于许多编译器和架构。我在我的一个项目中使用它。

http://www.hpl.hp.com/research/linux/qprof/download.php4

于 2010-12-03T04:10:18.963 回答
0

只需借用为 Linux 内核定义的障碍,只需将这些宏添加到您的头文件: http: //lxr.linux.no/#linux+v3.6.5/arch/x86/include/asm/barrier.h#L21。当然,在您的源代码中给予 Linux 开发人员荣誉。

于 2012-11-05T01:54:26.500 回答
0

最近 Qt 发行版的include/arch/qatomic_*.h标头包括用于许多架构和各种内存屏障(获取、释放,两者)的 (LGPL) 代码。

于 2009-07-26T20:30:24.340 回答