苹果的GCD留档声明如下:
GCD 提供并管理 FIFO 队列,您的应用程序可以以块对象的形式向其提交任务。提交到调度队列的块在完全由系统管理的线程池上执行。不保证执行任务的线程。GCD 提供三种类型的队列:
这是否意味着即使我发出请求
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{...});
这可能会导致代码块在主线程上执行?在这种情况下,在主线程上使用并发队列调用dispatch_sync似乎会导致主线程卡住等待自己的死锁情况。
我对GCD文件的解释是否正确?
是的,如果调用者在主线程上,那么dispatch_sync到全局队列可能意味着在主线程中执行代码。dispatch_sync的文档解释了:
作为优化,此函数尽可能调用当前线程上的块。
dispatch_sync总是在主线程上调度块
由于dispatch_sync等待块完成,所以块是在并发线程上执行还是在主线程上执行实际上没有太大区别;主线程仍然被阻塞。
因此,从主线程调用dispatch_sync会有效地阻塞主线程,直到块完成,因此,除非块只执行很短时间,否则这是一个坏主意。