在Linux上互锁的等价物

时间:2008-09-29 17:14:08

标签: c++ linux multithreading atomic

在C ++ Linux应用程序中,获取Win32上Interlocked函数提供的功能的最简单方法是什么?具体来说,一种轻量级的方式来原子递增或添加32位或64位整数?

7 个答案:

答案 0 :(得分:8)

英特尔的开源ThreadBuildingBlocks有一个模板Atomic,它提供与.NET的Interlocked类相同的功能。

与gcc的Atomic内置插件不同,它是跨平台的,不依赖于特定的编译器。正如Nemanja Trifunovic正确指出的那样,它确实依赖于x86和Itanium芯片提供的compare-and-swap CPU指令。我想你不会期待英特尔图书馆的任何其他内容:)

答案 1 :(得分:8)

只是为了澄清与 Linux 无关的问题。

RWM (读取 - 修改 - 写入)操作以及不执行单步操作的操作需要硬件支持才能执行 atomically ;其中有增量和减量,fetch_and_add等。

对于某些体系结构(包括I386,AMD_64和IA64),gcc内置了对原子内存访问的支持,因此不需要外部库。 Here您可以阅读有关API的一些信息。

答案 2 :(得分:6)

严格来说,Linux无法提供像Win32中那样的原子“互锁”功能,因为这些功能需要硬件支持,Linux运行在一些不提供支持的平台上。话虽如此,如果您可以将自己约束到Intel x86 / x64,请查看Boost共享指针库中引用计数的实现。

答案 3 :(得分:3)

Apache Portable Runtime中的atomic函数非常接近Win32 InterlockedXXX函数。

答案 4 :(得分:2)

您可以在源代码中插入一些汇编代码,以直接使用x68互锁指令。

您应该使用锁定xadd 操作。

例如参见this

答案 5 :(得分:2)

在GTK和QT编程中使用的相当常见的glib库以及独立的glib库提供了各种原子操作。有关列表,请参阅http://library.gnome.org/devel/glib/2.16/glib-Atomic-Operations.html。 Interlocked在Win32上支持的大多数操作都有g_atomic个函数,在硬件直接支持这些操作的平台上,它们被内联为所需的汇编代码。

答案 6 :(得分:-1)

经过进一步审核,this看起来很有希望。 Yay堆栈溢出。