从并发队列调用dispatch_sync - 它是否完全阻塞?

rb6*_*612 4 multithreading objective-c grand-central-dispatch ios swift

假设我从并发队列中调用dispatch_sync - 它会阻塞整个队列还是仅阻塞该执行线程?

cjn*_*vin 5

dispatch_sync 将阻塞调用者线程直到执行完成,并发队列有多个线程,因此它只会阻塞该队列上的其中一个线程,其他线程仍将执行。

苹果对此是这么说的:

将块提交到调度队列以进行同步执行。与dispatch_async不同,该函数在块完成之前不会返回。调用此函数并以当前队列为目标会导致死锁。

与dispatch_async不同的是,不会在目标队列上执行retain。因为对此函数的调用是同步的,所以它“借用”了调用者的引用。而且,没有对块执行Block_copy。

作为一种优化,该函数在可能的情况下调用当前线程上的块。

来源

  • ...隐含的答案是:不,它不会阻塞整个并发队列,因为并发队列由多个线程组成。 (3认同)