c++ - 如何在 Linux 上执行适用于 x86、arm、GCC 和 icc 的原子操作?

标签 c++ c linux atomic

如今,每个现代操作系统都提供了一些原子操作:

  • 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>不应该在用户空间中使用,我根本没有成功使用它。另外,我不确定它是否适用于英特尔编译器。

有什么建议吗?

我知道有很多相关的问题,但其中一些指向 __sync*这对我 (ARM) 来说是不可行的,有些指向 asm/atomic.h .

也许有一个内联汇编库可以为 GCC 做这件事(ICC 支持 gcc 汇编)?

编辑:

只有添加操作的部分解决方案(允许实现原子计数器但不能实现需要 CAS 的无锁结构):

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

不过我还是希望看到支持 CAS 的东西。

最佳答案

项目正在使用这个:

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

如果你想要简单的操作,比如 CAS,你不能只使用内核中特定于架构的实现,并使用 autotools/cmake 在用户空间进行架构检查吗?就许可而言,虽然内核是 GPL,但我认为这些操作的内联程序集是由 Intel/AMD 提供的,而不是内核对它们有许可,这是有争议的。它们恰好在内核源代码中以易于访问的形式出现。

关于c++ - 如何在 Linux 上执行适用于 x86、arm、GCC 和 icc 的原子操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2287451/

相关文章:

c++ - 二叉树的层序遍历

c - C中使用malloc后需要将变量分配给数组

c - 嵌套开关: why does the second switch command not accept an input?

linux - 对 bash 脚本进行故障排除以将每个单词的首字母大写

java - 如何在同一容器中运行 COPY 和 RUN 命令?

c++ - 函数参数中的C++数组指针

c++ - 使用 `std::wstring` 和 `std::wcout` 在 Linux 终端中打印拉丁字符

c++ - 抽象类的二维数组?

c - openssl 解密签名和加密的消息

linux - Mplayer:每秒缩略图