繁体   English   中英

gcc的__sync和__atomic内在函数有什么区别

[英]What is the difference between the __sync and __atomic intrinsics of gcc

我正在编写一个用gcc编译的玩具操作系统(因此我不能使用任何库,包括标准库),并且我想对某些同步代码使用原子。 经过一番搜索,我发现gcc有两组用于原子操作的内建函数__sync_ *__atomic_ * ,但是没有关于两者之间区别的信息。

这两者之间除了有一个用于存储顺序的参数外,还有什么区别? __sync_版本相当于__atomic_版本与顺序排序? __sync_版本赞成不赞成的__atomic_一个?

免责声明:我以前没有使用过这些原语。 以下答案是基于我对文档的阅读以及先前的并发经验。

是否已弃用__sync_版本,而赞成__atomic_版本?

是的,您应该使用__atomic,并在必要时让编译器退回到__sync。

__sync_版本是否与按顺序排序的__atomic_版本等效?

不,确切的订购保证在__sync文档中指定。 如果使用__atomic,并且编译器选择回退到__sync,则它将添加代码来满足请求的顺序保证。

从__atomic的文档中:

鼓励目标体系结构为每个内置功能提供自己的模式。 如果未提供目标,则将使用原始的'__sync'原子内置函数的非内存模型集,以及围绕它的任何必需的同步防护,以实现正确的行为。 在这种情况下,执行与内置功能受到相同的限制。

最后的警告:并不是所有的__sync或__atomic操作都可以内联实现。 编译器可以将它们实现为对(大概)在标准库中实现的外部函数的调用。 如果您无权访问标准库,则必须自己实现缺少的功能。 这是文档中的相关报价:

如果没有提供无锁指令序列的模式或机制,则使用在运行时要解析的相同参数调用外部例程。

这些原语是一种低级机制,您应该了解编译器可以做什么和不能做什么。

有关编译器内联生成哪些代码的示例,请参见相关问题: gcc的原子操作和代码生成

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM