gpt4 book ai didi

ios - dispatch_sync里面的dispatch_sync导致死锁

转载 作者:可可西里 更新时间:2023-11-01 05:04:27 26 4
gpt4 key购买 nike

我刚刚在 objc.io Going Fully Asynchronous 上读到这篇文章但找不到很好的解释

dispatch_queue_t queueA; // assume we have this
dispatch_sync(queueA, ^(){ // (a)
dispatch_sync(queueA, ^(){ // (b)
foo();
});
});

Once we hit the second dispatch_sync we’ll deadlock: We can’t dispatch onto queueA, because someone (the current thread) is already on that queue and is never going to leave it.

只要我懂

  1. dispatch_sync 只需添加工作项(我避免使用“ block ”一词因为它可能会混淆)到 queueA,那么这个工作项将被发送到 queueA 的目标队列,然后 GCD 将保留一个线程此工作项的threadWorkItem
  2. 当我到达 (b) 时,我在线程 threadWorkItem 中(假设 threadWorkItem 是该线程的名称),所以我想将另一个工作项排入队列以queueA 没问题。但是有人说这时候queueA被preserved,queueA被blocked -> 导致死锁,让我很疑惑

我已经阅读了很多与此相关的主题,例如 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 阻塞队列,有人说它阻塞当前线程,... :(

那么为什么会造成死锁呢?

最佳答案

dispatch_sync 会阻塞当前线程,直到分派(dispatch)的代码完成,如果您从串行队列同步分派(dispatch),那么实际上您也阻塞了队列。因此,如果您从串行队列同步调度到自身,则会导致死锁。

但需要明确的是,dispatch_sync 阻塞的是当前线程,而不是当前队列。在处理并发队列时,不同的工作线程将用于后续分派(dispatch)的 block ,不会导致死锁。

您似乎是在回应 Dispatch Queues 末尾的讨论Concurrency Programming Guide 的章节, 说:

Do not call the dispatch_sync function from a task that is executing on the same queue that you pass to your function call. Doing so will deadlock the queue. If you need to dispatch to the current queue, do so asynchronously using the dispatch_async function.

这并不完全正确。如果(a)您正在使用并发队列执行此操作; (b) 有可用的工作线程,这不会导致死锁。但这是一种不好的做法,应该避免,尽管如此。

关于ios - dispatch_sync里面的dispatch_sync导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23939730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com