在C ++ Linux应用程序中,获取 Win32上的互锁功能提供?具体来说,一种轻量级的方式来原子递增或添加32位或64位整数?

有帮助吗?

解决方案 7

进一步审核后,看起来很有希Yay堆栈溢出。

其他提示

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

与gcc的Atomic内置插件不同,它是跨平台的,不依赖于特定的编译器。正如Nemanja Trifunovic正确指出的那样,它确实取决于所提供的比较和交换 CPU指令通过x86和Itanium芯片。我想你不会期待英特尔图书馆的任何其他内容:)

只是为了澄清与 Linux 无关的问题。

RWM (读取 - 修改 - 写入)操作以及不执行单步操作的操作需要硬件支持才能执行 atomically ;其中有增量和减量,fetch_and_add等。

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

严格来说,Linux无法提供原子级“互锁”功能。功能与Win32中的功能类似,只是因为这些功能需要硬件支持,Linux运行在一些不提供支持的平台上。话虽如此,如果您可以将自己约束到Intel x86 / x64,请查看Boost共享指针库中引用计数的实现。

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

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

您应该使用锁定xadd 操作。

例如,请参阅

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top