问题 无锁结构的C ++原子操作


我正在使用原子(双)比较和交换指令实现无锁机制,例如cmpxchg16b

我目前正在汇编中编写它然后将其链接进去。但是,我想知道是否有办法让编译器自动为我执行此操作?例如使用'atomically'环绕代码块并让它弄清楚如何在底层处理器体系结构中将代码实现为原子指令(或者如果底层arch不支持它,则在编译时生成错误)?

附:我知道gcc有一些内置函数(至少对于CAS)

http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html#Atomic-Builtins


10340
2018-05-30 23:58


起源



答案:


已经有点回答了 这里

C ++ 0x标准将提供一些 原子数据类型,主要是使用std :: atomic <>模板的整数和空类型。那篇文章提到了 Boehm的atomic_ops项目 你今天可以下载和使用它。

如果没有,你不能在编译器中实现汇编内联吗?我知道MSVC有 __asm 内联汇编程序例程的关键字。谷歌说 ,gcc 也可以做到


11
2018-05-31 00:49



MSVC具有互锁操作,并且GCC具有内置的原子操作功能,因此不需要使用内联汇编程序。通过使用编译器包装器,您将保持可移植到编译器支持的所有平台 - bdonlan
MSVC只有长数据类型的互锁操作,OP想要双打。 - gbjbaanb
gcc没有用于DWCAS的内置操作。 MSVC内置了DWCAS。没有OS具有DW(双字,例如两个指针长度,并排)用于递增,递减等 - DW仅存在且仅存在(并且仅存在)用于CAS。


答案:


已经有点回答了 这里

C ++ 0x标准将提供一些 原子数据类型,主要是使用std :: atomic <>模板的整数和空类型。那篇文章提到了 Boehm的atomic_ops项目 你今天可以下载和使用它。

如果没有,你不能在编译器中实现汇编内联吗?我知道MSVC有 __asm 内联汇编程序例程的关键字。谷歌说 ,gcc 也可以做到


11
2018-05-31 00:49



MSVC具有互锁操作,并且GCC具有内置的原子操作功能,因此不需要使用内联汇编程序。通过使用编译器包装器,您将保持可移植到编译器支持的所有平台 - bdonlan
MSVC只有长数据类型的互锁操作,OP想要双打。 - gbjbaanb
gcc没有用于DWCAS的内置操作。 MSVC内置了DWCAS。没有OS具有DW(双字,例如两个指针长度,并排)用于递增,递减等 - DW仅存在且仅存在(并且仅存在)用于CAS。


C ++未来的“C ++ 0x”标准将支持原子操作和c - 参见例如 http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2007/n2427.html 进行合理的讨论。在所述即将出台的标准得到批准和广泛实施之前,当然,没有办法在编译器之间“移植”这样的功能;如果您对gcc之外的特定编译器感兴趣,也许您可​​以专门针对它们打开另一个问题。


5
2018-05-31 00:07



不确定我是否遗漏了一些内容,但链接的文章似乎并不相关。 - bugmenot77
你是对的,粘贴了错误的URL - 现在编辑修复,谢谢! - Alex Martelli