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