便携式比较和交换(原子操作)C / C ++库?(Portable Compare And Swap

2019-06-17 12:16发布

是否有小型图书馆,是wrapps各种处理器的CAS般的操作为宏或功能,跨多个编译器移植?

PS。 该atomic.hpp库是升压::进程间::详细的命名空间中。 笔者拒绝,使之成为市民,保持良好的图书馆。

让我们重新讨论这个问题,并看看是否有任何其他的选择吗?

Answer 1:

英特尔线程构建模块有一个很好的便携atomic<T>模板,你想要做什么。 但无论是一个小型图书馆与否当然可以进行辩论..



Answer 2:

OPA(打开便携式原子公司)可能是一个很好的适合你的需求。 https://trac.mcs.anl.gov/projects/openpa/

它提供了一个一致的C API到下一个MIT风格许可跨平台通用原子操作。 图书馆很小,肯定能满足您的尺寸要求。 目前的平台列表:

  • GCC联汇编用于x86,x86_64的,IA64,PPC 440和MIPS 5K处理器。 与GCC兼容上下的前端有几个编译器也支持同样的结构,如国际商会,PGI,和IBM的XLC。
  • GCC原子内部函数,所以大多数GCC-4.1 +设备的支持。
  • 在Sun Solaris的原子操作库。
  • Windows NT的内部函数(虽然你目前要做额外的工作一点点地建立在Windows上)。
  • 两个伪平台,并行线程互斥基于仿真的便携性,否则不支持的平台(而牺牲一些性能),并在代码中使用是有条件编译单线程代码“不安全”的实现。

我从来没有把它用在C ++程序,但它应该有很少或没有变化工作。 我会很高兴,如果你遇到麻烦,(只是邮件opa-discuss@lists.mcs.anl.gov)调整它。



Answer 3:

升压进程间库可能是你所追求的 - 在Atomic.hpp包括文件包含了比较并交换实现为各种平台和编译器。



Answer 4:

您可能会感兴趣的油嘴的原子操作的功能,

g_atomic_int_compare_and_exchange()

实现了各种架构的CAS语义。 实施本身是比较容易理解,可以独立使用,无需太多精力,你可以在svn.gnome.org/viewvc/下油嘴/主干/油嘴/ gatomic找到它。{C,H}。 希望这可以帮助!



Answer 5:

在Mac OS X和Windows有内置的比较并交换功能,您应该使用反正(InterlockedCompareExchange()和OSAtomicCompareAndSwapPtrBarrier(分别))。 不管在这些平台上的编译器将因此工作。

在其他Unix系统实在是有点棘手,如果你正在使用GCC 4.1或更高版本,你可以只使用其内置__sync_val_compare_and_swap(),以及许多虽然不是所有的UNIX编译器支持合理的GCC的扩展,因为源自Linux上的很多代码假定它们存在。

所以,如果你想包装起来的,随着对OS X和Windows的所有处理器最重要的编译器的工作原理,并与海湾合作委员会和你应该做的事情像其他平台的一些其他的编译器的方式:

boolean CompareAndSwapPointer(volatile * void * ptr,
                                  void * new_value,
                                  void * old_value) {
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050
  return OSAtomicCompareAndSwapPtr (old_value, new_value, ptr);
#elif defined(_MSC_VER)
  return InterlockedCompareExchange(ptr, new_value, old_value);
#elif (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
  return __sync_val_compare_and_swap(ptr, old_value, new_value);
#else
#  error No implementation
#endif
}

也就是说没有测试,但我认为这应该是正确的。 注意:所有的OS库如何采取ARGS以不同的顺序;-)

显然,对于不同大小的比较和掉期和包装他们的模板,如果你愿意,你可以做几个版本。 这些API大多是基于C和编码类型的信息进入功能以这样的方式,它是用来通过模板参数化类型的人有点讨厌。



Answer 6:

还有就是图书馆atomic_ops而由贝姆项目。 不知道有关许可证,虽然。



Answer 7:

有一个建议的C ++ 0x兼容升压原子学库: http://www.chaoticmind.net/~hcb/projects/boost.atomic/

这个库的目的是提供一种用于增压原子操作的实现,基于由所述的C ++ 0x草案标准中指定的接口上。 它的目的是使过渡到std ::原子容易,并提供使用在旧系统上这个的C ++ 0x功能编译使代码的手段。

这显然不是加速的一部分,但你可以看看这里的审查线程: http://lists.boost.org/Archives/boost/2009/12/160195.php

Boost.Atomic现在是,我认为称它是释放一个形式。 它有“真”原子变量支持:

  • GCC / 86,32位(在Linux,FreeBSD测试)
  • GCC / 86,64位(在Linux测试)
  • GCC / powerpc32(在Linux测试的Mac OS X)
  • GCC / powerpc64(未测试的)
  • 通用的Win32(与Visual Studio Express的在Win XP下测试)

对于所有其他优雅地回落到锁定操作。 有适当的QuickBook文档,其中包括一个有希望说明性示例部分。



Answer 8:

什么撰文称(在你提供的链接)是“我认为,直到一些官方Boost库降临时,你可以放心地使用它们”。 推迟所述接口改变,直到“当原子功能将要存在于C ++ 0X”。

不管你今天使用的,你可能会想迁移到新std::功能时,它的可用反正。

升压东西一般是相当不错的,看起来像是在发布Boost库的实现中使用。 我也一直在尝试使用,落实了几次。

我去了。



Answer 9:

您还可以看看libsync从灵感http://www.ioremap.net/node/224 ,这是相当新的(也许是太新的),但它在Elliptics网络中使用,以便它得到的(一些?)测试。

它也给你更高级别的原语旁边CAS:线程间的无锁同步RCU(读取复制更新)。

但是,这取决于你的意思是“便携”是什么:它支持archtectures x86和PPC,操作系统的Linux,FreeBSD的,OpenBSD系统,Solaris和MacOSX的,但是......没有窗户。

而许可证是GPL,你可以恨或爱。



文章来源: Portable Compare And Swap (atomic operations) C/C++ library?