13

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

4

7 回答 7

8

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

与 gcc 的 Atomic 内置程序不同,它是跨平台的,不依赖于特定的编译器。正如 Nemanja Trifunovic 在上面正确指出的那样,它确实依赖于 x86 和 Itanium 芯片提供的比较和交换CPU 指令。我想您不会期望英特尔库中的其他任何东西:)

于 2008-09-29T17:17:01.677 回答
8

只需几条注释即可澄清与Linux无关的问题。

RWM(读-修改-写)操作和那些不单步执行的操作需要硬件支持才能原子执行;其中包括增量和减量、fetch_and_add 等。

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

于 2008-09-29T19:31:05.193 回答
6

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

于 2008-09-29T18:10:42.347 回答
3

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

于 2008-09-30T11:33:40.683 回答
2

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

您应该使用lock xadd操作。

参见例如this

于 2008-12-01T15:21:30.147 回答
2

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

于 2008-12-01T21:05:14.197 回答
-1

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

于 2008-09-29T17:15:53.490 回答