【发布时间】:2010-09-14 01:32:09
【问题描述】:
在 C++ Linux 应用程序中,获取 Win32 上的 Interlocked 函数提供的功能的最简单方法是什么?具体来说,一种以原子方式递增或添加 32 位或 64 位整数的轻量级方法?
【问题讨论】:
标签: c++ linux multithreading atomic
在 C++ Linux 应用程序中,获取 Win32 上的 Interlocked 函数提供的功能的最简单方法是什么?具体来说,一种以原子方式递增或添加 32 位或 64 位整数的轻量级方法?
【问题讨论】:
标签: c++ linux multithreading atomic
英特尔的开源 ThreadBuildingBlocks 有一个模板 Atomic,它提供与 .NET 的 Interlocked 类相同的功能。
与 gcc 的 Atomic 内置程序不同,它是跨平台的,不依赖于特定的编译器。正如 Nemanja Trifunovic 在上面正确指出的那样,它确实依赖于 x86 和 Itanium 芯片提供的compare-and-swap CPU 指令。我猜你不会期待英特尔库中的其他任何东西:)
【讨论】:
只是一些注释来澄清与 Linux 无关的问题。
RWM(读取-修改-写入)操作和那些不单步执行的操作需要硬件支持才能原子地执行;其中有递增和递减、fetch_and_add 等。
对于某些架构(包括 I386、AMD_64 和 IA64),gcc 具有对原子内存访问的内置支持,因此不需要外部库。 Here你可以阅读一些关于API的信息。
【讨论】:
严格来说,Linux 不能提供像 Win32 中那样的原子“联锁”功能,仅仅是因为这些功能需要硬件支持,而 Linux 运行在一些不提供这种支持的平台上。话虽如此,如果你能把自己限制在 Intel x86/x64 上,看看 Boost 共享指针库中引用计数的实现。
【讨论】:
Apache Portable Runtime 中的atomic 函数非常接近 Win32 InterlockedXXX 函数。
【讨论】:
【讨论】:
在 GTK 和 QT 编程以及独立程序中使用的相当常见的 glib 库提供了各种原子操作。有关列表,请参阅http://library.gnome.org/devel/glib/2.16/glib-Atomic-Operations.html。在 Win32 上 Interlocked 支持的大多数操作都有 g_atomic 函数,在硬件直接支持这些操作的平台上,它们被内联为所需的汇编代码。
【讨论】:
经过进一步审查,this 看起来很有希望。耶堆栈溢出。
【讨论】: