我正在编写一个玩具操作系统(所以我不能使用任何库,包括标准的库),用gcc编译,我想使用atomics作为一些同步代码。经过一些搜索,我发现gcc有两组用于原子操作的内置函数__sync_*和__atomic_*,但是没有关于两者之间差异的信息。
除了后者有一个内存排序参数之外,这两者有什么区别? __sync_
版本是否等同于__atomic_
版本的顺序排序?是否弃用__sync_
版本以支持__atomic_
版本?
答案 0 :(得分:4)
免责声明:我之前没有使用过这些原语。以下答案基于我对文档的阅读和以前的并发经验。
__sync_版本是否已弃用而不支持__atomic_ one?
是的,您应该使用__atomic并让编译器在必要时回退到__sync。
__sync_版本是否等同于具有顺序排序的__atomic_版本?
不,确切的排序保证在__sync的文档中指定。如果您使用__atomic,并且编译器选择回退到__sync,那么它将添加代码以满足请求的排序保证。
来自__atomic的文档:
鼓励目标体系结构为每个内置函数提供自己的模式。如果没有提供目标,则使用原始的非内存模型集'__sync'原子内置函数,以及围绕它的任何所需的同步围栏,以便实现正确的行为。在这种情况下执行受到与内置函数相同的限制。
最后要提醒的是:并非所有__sync或__atomic操作都可以内联实现。编译器可以将它们实现为对(可能)在标准库中实现的外部函数的调用。如果您无法访问标准库,那么您必须自己实现缺失的功能。以下是文档中的相关引用:
如果没有提供无锁指令序列的模式或机制,则调用具有相同参数的外部例程,以便在运行时解析。
这些原语是一种低级机制,您应该了解编译器可以做什么和不能做什么。
有关编译器内联生成的代码的示例,请参阅相关问题:Atomic operations and code generation for gcc