之间有什么区别
我正在写一个玩具操作系统(所以我不能使用任何库,包括标准库),使用gcc编译,我想用一些同步代码的原子。 经过一番搜索之后,我发现gcc有两套用于原子操作的内建函数__sync_ *和__atomic_ *,但没有关于两者之间差异的信息。
除了后者之外,这两者之间还有什么区别?有内存排序的参数吗? 是__sync_
版本相当于__atomic_
版本与顺序排序? 是__sync_
版本弃用__atomic_
一个吗?
免责声明:我以前没有使用过这些原语。 以下答案基于我阅读文档和以前的并发经验。
是__sync_版本弃用__atomic_一个吗?
是的,您应该使用__atomic,并在必要时让编译器回退到__sync。
__sync_版本是否与__atomic_版本具有相同的顺序?
不,确切的订购保证在__sync的文档中指定。 如果使用__atomic,并且编译器选择回退到__sync,那么它将添加代码以满足请求的排序保证。
从__atomic的文档:
鼓励目标体系结构为每个内置函数提供自己的模式。 如果未提供目标,则会使用原始非内存模型集“__sync”原子内置函数以及其周围的任何必需的同步防护,以实现正确的行为。 在这种情况下的执行受到与那些内置函数相同的限制。
最后要注意的一点是:并不是所有的__sync或__atomic操作都可以在线实现。 编译器可以将它们实现为对标准库中实现的外部函数的调用(推测)。 如果您无法访问标准库,那么您必须自己实现缺失的功能。 以下是文档中的相关引用:
如果没有提供无锁定指令序列的模式或机制,则会在运行时调用具有相同参数的外部例程。
这些原语是一种低级机制,你应该理解编译器可以做什么和不可以做什么。
有关编译器生成内联代码的示例,请参阅相关问题:gcc的原子操作和代码生成
链接地址: http://www.djcxy.com/p/85787.html