用户空间中的内存障碍? (Linux,x86-64)

时间:2009-07-26 17:25:22

标签: c++ c multithreading lock-free memory-barriers

在内核端设置内存障碍很容易:由于Linux内核头文件,宏mb,wmb,rmb等总是存在。

如何在用户端完成此操作?

8 个答案:

答案 0 :(得分:7)

Posix defines a number of functions充当记忆障碍。不得同时访问内存位置;为了防止这种情况,请使用同步 - 并且同步也可以作为障碍。

答案 1 :(得分:5)

您正在寻找gcc的full memory barrier原子内置。

请注意我在此处提供的参考资料的详细信息,

  

[following]内置版旨在与 Intel Itanium处理器专用应用程序二进制接口中的第7.4节中描述的内容兼容。因此,它们偏离了正常的GCC使用“__builtin_”前缀的做法,而且它们被重载使得它们可以在多种类型上工作。

答案 2 :(得分:4)

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

它不是特定于编译器的,并且比GCC的东西少。它不是一个巨大的图书馆,它提供了许多你不关心的功能。它只是提供原子操作。此外,它可以移植到不同的CPU架构。

答案 3 :(得分:2)

Linux x64意味着您可以使用Intel内存屏障说明。 您可以将它们包装在类似于Linux头文件中的宏中,如果 这些宏不适合您的代码

答案 4 :(得分:2)

GCC 4.4 +中的

__sync_synchronize()

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

最近的Qt发行版的include/arch/qatomic_*.h标题包含许多架构的(LGPL)代码和各种内存障碍(获取,发布,两者)。