dispatch_async() 和类似的东西是否提供内存栅栏?

Does dispatch_async() and similar provide memory fences?

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

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

[S]ince the use of GCD hasn't brought catastrophe down on all of our heads, I assume that dispatch_async() and the like do provide such memory barriers. Likewise, NSOperationQueue, -performSelector:onThread:..., and the like must also. Is that right?

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