在 C++ Linux 应用程序中,获取 Win32 上的Interlocked函数提供的功能的最简单方法是什么?具体来说,一种以原子方式递增或添加 32 位或 64 位整数的轻量级方法?
7 回答
英特尔的开源ThreadBuildingBlocks有一个模板 Atomic,它提供与 .NET 的 Interlocked 类相同的功能。
与 gcc 的 Atomic 内置程序不同,它是跨平台的,不依赖于特定的编译器。正如 Nemanja Trifunovic 在上面正确指出的那样,它确实依赖于 x86 和 Itanium 芯片提供的比较和交换CPU 指令。我想您不会期望英特尔库中的其他任何东西:)
只需几条注释即可澄清与Linux无关的问题。
RWM(读-修改-写)操作和那些不单步执行的操作需要硬件支持才能原子执行;其中包括增量和减量、fetch_and_add 等。
对于某些架构(包括 I386、AMD_64 和 IA64),gcc 具有对原子内存访问的内置支持,因此不需要外部库。在这里,您可以阅读有关 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。g_atomic
在 Win32 上 Interlocked 支持的大多数操作都有函数,在硬件直接支持这些操作的平台上,它们被内联为所需的汇编代码。
经过进一步审查,这看起来很有希望。耶堆栈溢出。