当我尝试 GCD 函数时dispatch_barrier_async
,它在创建的队列上按预期工作dispatch_queue_create
,而当我将它放在创建的全局队列上时dispatch_get_global_queue
,屏障似乎不再起作用 = =,有人可以解释一下吗?谢谢~
演示图片
问问题
692 次
2 回答
3
这并不奇怪,它是记录在案的行为。
如果您使用它向您自己创建的队列添加一个块,那么它将阻止所有其他块,直到它完成。如果将它添加到公共队列,那么它的行为就像dispatch_async
https://developer.apple.com/reference/dispatch/1452797-dispatch_barrier_async上的文档
其中指出:
您指定的队列应该是您使用 dispatch_queue_create 函数自己创建的并发队列。如果您传递给此函数的队列是串行队列或全局并发队列之一,则此函数的行为类似于 dispatch_async 函数。
于 2016-07-31T10:49:36.407 回答
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/
于 2018-12-11T12:10:43.967 回答