Apple的GCD文档声明如下:
GCD提供并管理应用程序可以使用的FIFO队列 以块对象的形式提交任务。提交的块 调度队列在完全由...管理的线程池上执行 系统。不保证任务的线程 执行。 GCD提供三种队列:
这是否意味着即使我发出了诸如
之类的请求dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{...});
它可能导致在主线程上执行代码块?在这种情况下,似乎在主线程上使用并发队列调用dispatch_sync可能会导致主线程卡在等待自身的死锁情况。
我对GCD文件的解释是否正确?
答案 0 :(得分:1)
是的,似乎dispatch_sync到全局队列可能意味着如果调用者在主线程上,则在主线程上执行代码。 dispatch_sync的文档说明:
作为优化,此函数会在可能的情况下调用当前线程上的块。
答案 1 :(得分:0)
由于dispatch_sync等待块完成,因此无论块是在并发线程还是主线程上执行都没有多大区别;无论如何,主线程被阻止了。
因此,从主线程调用dispatch_sync会有效地阻塞主线程直到块完成,因此除非块仅执行一小段时间,否则这是一个坏主意。