【发布时间】:2014-05-29 17:52:01
【问题描述】:
我刚刚在objc.io Going Fully Asynchronous 上读到了这篇文章,但找不到很好的解释
dispatch_queue_t queueA; // assume we have this
dispatch_sync(queueA, ^(){ // (a)
dispatch_sync(queueA, ^(){ // (b)
foo();
});
});
一旦我们到达第二个 dispatch_sync 我们就会死锁:我们不能 dispatch 到 queueA 上,因为有人(当前线程)已经在上面了 排队,永远不会离开它。
只要我明白
-
dispatch_sync只需添加工作项(我避免使用“块”这个词 因为它可能会混淆)到 queueA,然后这个工作项将被发送 到 queueA 的目标队列,然后 GCD 将保留一个线程 此工作项的 threadWorkItem - 当我到达 (b) 时,我在线程 threadWorkItem 中(假设 threadWorkItem 是这个线程的名称),所以我认为将另一个工作项加入队列queueA 没问题。但是有人说这个时候queueA被保留了,queueA被阻塞了->导致死锁,这让我很困惑
我已经阅读了很多与此相关的帖子,例如Deadlock with dispatch_sync、Why can't we use a dispatch_sync on the current queue?、Why is this dispatch_sync() call freezing?,...但找不到很好的解释。有人说dispatch_sync 阻塞了队列,有人说它阻塞了当前线程,... :(
那为什么会导致死锁呢?
【问题讨论】:
标签: ios sync grand-central-dispatch deadlock dispatch