一尘不染

如何在Linux上执行可在x86,arm,GCC和icc上运行的原子操作?

linux

今天,每个现代OS都提供一些原子操作:

  • Windows具有Interlocked*API
  • FreeBSD有 <machine/atomic.h>
  • Solaris有 <atomic.h>
  • Mac OS X具有 <libkern/OSAtomic.h>

像Linux一样的东西吗?

  • 我需要它在大多数Linux支持的平台上工作,包括:x86,x86_64和 arm
  • 我至少在GCC和Intel编译器上需要它。
  • 我不需要使用像glib或qt这样的3rd par库。
  • 我需要它才能在C ++中工作(不需要C)

问题:

  • GCC原子内建函数__sync_*并非在所有平台(ARM)上都受支持,并且英特尔编译器也不支持。
  • AFAIK <asm/atomic.h>不应在用户空间中使用,并且我还没有成功使用过。另外,我不确定它是否可以与Intel编译器一起使用。

有什么建议么?

我知道有很多相关问题,但是其中一些问题__sync*对我(ARM)而言是不可行的,而某些问题则针对asm/atomic.h

也许有一个针对GCC的内联汇编库(ICC支持gcc汇编)?

编辑:

对于添加操作,有一个非常局部的解决方案(允许实现原子计数器,但不能锁定需要CAS的自由结构):

如果使用libstc++(英特尔编译器使用libstdc++),则可以使用或__gnu_cxx::__exchange_and_add中定义的值。取决于编译器版本。<ext/atomicity.h>``<bits/atomicity.h>

但是,我仍然希望看到一些支持CAS的东西。


阅读 305

收藏
2020-06-02

共1个答案

一尘不染

项目正在使用此:

http://packages.debian.org/source/sid/libatomic-
ops

如果您想要简单的操作(例如CAS),您是否不能仅使用内核之外的特定于arch的实现,并使用autotools /
cmake在用户空间中进行arch检查?就许可而言,尽管内核是GPL,但我认为这些操作的内联程序集由Intel /
AMD提供是有争议的,而不是内核具有许可证。它们恰好是内核源代码中易于访问的形式。

2020-06-02