在Linux上相互等效

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

Solutions Collecting From Web of "在Linux上相互等效"

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

不像gcc的Atomic内置插件,它是跨平台的,不依赖于特定的编译器。 正如Nemanja Trifunovic在上面正确指出的,它依赖于x86和Itanium芯片提供的比较和交换 CPU指令。 我想你不会期望英特尔库中的其他东西)

只需要几个笔记来澄清与Linux无关的问题。

RWM (读 – 修改 – 写)操作和那些不一步执行的操作需要硬件支持来自动执行; 其中增量和减量,fetch_and_add等

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

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

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

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

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

您应该使用锁定xadd操作。

看这个例子。

经进一步审查, 这看起来很有希望。 耶堆栈溢出。