在Linux上互锁的等效项

时间:2020-03-06 14:53:08  来源:igfitidea点击:

在C ++ Linux应用程序中,获得Win32上的互锁功能提供的功能的最简单方法是什么?具体来说,是一种原子地递增或者相加32或者64位整数的轻量级方法吗?

解决方案

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

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

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

严格来说,Linux不能像Win32中那样提供原子的"互锁"功能,仅仅是因为这些功能需要硬件支持,而Linux在某些不提供该功能的平台上运行。话虽如此,如果我们可以使用Intel x86 / x64,请看一下Boost共享指针库中引用计数的实现。

仅有少量注释可以澄清与Linux无关的问题。

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

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

Apache Portable Runtime的原子函数实际上与Win32 InterlockedXXX函数非常接近。

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

我们应该使用锁定xadd操作。

举例来说看这个。

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