【问题标题】:Does dispatch_async() and similar provide memory fences?dispatch_async() 和类似的是否提供内存栅栏?
【发布时间】:2015-04-25 12:12:44
【问题描述】:

当我通过dispatch_async 或类似方法在任何队列上运行块时,GCD 是否在块调用周围提供线程围栏?我会假设它确实如此,但据我所知,文档没有给出任何暗示。

【问题讨论】:

  • 您认为哪些地方可能无法正常工作?
  • @gnasher729 没什么特别的,我只是想知道我是否需要放下自己的内存栅栏,或者 GCD 是否已经使用了它们。这更像是一个概念性问题。

标签: objective-c grand-central-dispatch memory-fences


【解决方案1】:

来自 Cocoa-Dev 邮件列表上的电子邮件线程,Greg Parker(Apple 的运行时工程师之一)replied to a question of mine

[S]因为使用 GCD 并没有给我们所有人带来灾难,我假设 dispatch_async() 和类似的东西确实提供了这样的内存屏障。同样,NSOperationQueue、-performSelector:onThread:... 等也必须如此。对吗?

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

【讨论】:

  • 太棒了,谢谢,这正是我想要的。我开始浏览调度源代码,但它并不完全简单,因为它的 vtable 用法和宏无处不在。
猜你喜欢
  • 2020-05-27
  • 2022-01-15
  • 1970-01-01
  • 2011-11-12
  • 2021-09-11
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多