在C ++ Linux应用程序中,获取Win32上Interlocked函数提供的功能的最简单方法是什么?具体来说,一种轻量级的方式来原子递增或添加32位或64位整数?
答案 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)
答案 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堆栈溢出。