【问题标题】: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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2010-10-14
    • 2011-08-16
    • 2017-07-16
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多