dispatch_barrier_async似乎对全局队列没有影响?

时间:2016-07-31 10:38:56

标签: ios ios-multithreading

当我尝试GCD函数dispatch_barrier_async时,它在dispatch_queue_create创建的队列上按预期工作,而当我将它放在由dispatch_get_global_queue创建的全局队列时,屏障似乎不再工作了= =,有人可以解释一下吗?谢谢〜 the demo image

2 个答案:

答案 0 :(得分:3)

这并不奇怪,它是记录在案的行为。

如果您使用此块将块添加到您自己创建的队列中,那么它将阻止所有其他块,直到它完成。如果将其添加到公共队列,则其行为与dispatch_async

类似

https://developer.apple.com/reference/dispatch/1452797-dispatch_barrier_async

上的文档

哪个州:

  

您指定的队列应该是您使用dispatch_queue_create函数自己创建的并发队列。如果传递给此函数的队列是串行队列或全局并发队列之一,则此函数的行为类似于dispatch_async函数。

答案 1 :(得分:0)

全局队列是根队列,由线程池管理,并且是所有自定义队列的父队列。这意味着由根队列管理的屏障规则适用于自定义队列,而不适用于全局队列本身。

GCD exposes five different queues: the main queue running on the main thread,
three background queues with different priorities, and one background queue 
with an even lower priority, which is I/O throttled. Furthermore, you can 
create custom queues, which can either be serial or concurrent queues. While 
custom queues are a powerful abstraction, all blocks you schedule on them 
will ultimately trickle down to one of the system’s global queues and its 
thread pool(s).

https://www.objc.io/issues/2-concurrency/concurrency-apis-and-pitfalls/