dispatch_async()和类似函数提供内存屏障吗?

3

当我通过dispatch_async或类似方法在任何队列上运行块时,GCD是否提供线程栅栏来保护块调用?我认为它会提供,但据我所知,文档没有给出任何提示。


你认为可能出了什么问题,导致它不能像你期望的那样工作? - gnasher729
@gnasher729 没有特别的,我只是想知道我是否需要放置自己的内存栅栏,或者GCD已经使用它们了。这更像是一个概念性问题。 - JustSid
1个回答

6

在 Cocoa-Dev 邮件列表的一封电子邮件中,苹果公司的运行时工程师 Greg Parker(之一)回答了我的一个问题

既然使用 GCD 没有让我们的头上发生灾难,我认为 dispatch_async() 等函数确实提供了这样的内存屏障。同样,NSOperationQueue、-performSelector:onThread:...等功能也应该提供。对吗?

我期望任何不提供足够内存屏障功能的多处理原语都会大声记录这一事实。dispatch_once() 的存储是缺少内存屏障的文档化示例。OSAtomic 函数的一些也是另一个示例。但几乎所有比这更重量级的东西都应该为任何客户端提供完整的内存屏障。


太棒了,谢谢,这正是我要找的。我开始阅读调度源代码,但它的鞋拔子虚表用法和到处都是宏定义,使得理解起来并不完全简单。 - JustSid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接