【问题标题】:What is the difference between the __sync and __atomic intrinsics of gccgcc 的 __sync 和 __atomic 内在函数有什么区别
【发布时间】:2014-05-03 15:15:24
【问题描述】:
我正在编写一个玩具操作系统(所以我不能使用任何库,包括标准库),用 gcc 编译,我想对一些同步代码使用原子。经过一番搜索,我发现gcc有两组用于原子操作的内置函数__sync_*和__atomic_*,但没有关于两者区别的信息。
除了后者有内存排序的参数之外,这两者有什么区别? __sync_ 版本是否等同于具有顺序排序的__atomic_ 版本?是否已弃用 __sync_ 版本以支持 __atomic_ 版本?
【问题讨论】:
标签:
c
gcc
synchronization
atomic
【解决方案1】:
免责声明:我以前没有使用过这些原语。以下答案基于我对文档的阅读和之前的并发经验。
是否已弃用 __sync_ 版本以支持 __atomic_ 版本?
是的,您应该使用 __atomic 并让编译器在必要时回退到 __sync。
__sync_ 版本是否等同于顺序排序的 __atomic_ 版本?
不,确切的排序保证在 __sync 的文档中指定。如果您使用 __atomic,并且编译器选择回退到 __sync,那么它将添加代码以满足请求的顺序保证。
来自 __atomic 的文档:
鼓励目标架构为每个内置函数提供自己的模式。如果没有提供目标,则使用原始的“__sync”原子内置函数的非内存模型集,以及围绕它的任何必需的同步栅栏,以实现正确的行为。这种情况下的执行受到与那些内置函数相同的限制。
最后一句警告:并非所有的 __sync 或 __atomic 操作都可以内联实现。编译器可以将它们实现为对(可能)在标准库中实现的外部函数的调用。如果您无权访问标准库,那么您必须自己实现缺少的功能。以下是文档中的相关引用:
如果没有提供无锁指令序列的模式或机制,则会调用具有相同参数的外部例程,以便在运行时解析。
这些原语是低级机制,你应该了解编译器能做什么,不能做什么。
编译器内联生成什么代码的例子,见相关问题:Atomic operations and code generation for gcc