如今,每个现代操作系统都提供了一些原子操作:
- 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/