- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我刚刚在 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.
只要我懂
dispatch_sync
只需添加工作项(我避免使用“ block ”一词因为它可能会混淆)到 queueA,那么这个工作项将被发送到 queueA 的目标队列,然后 GCD 将保留一个线程此工作项的threadWorkItem我已经阅读了很多与此相关的主题,例如 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 thedispatch_async
function.
这并不完全正确。如果(a)您正在使用并发队列执行此操作; (b) 有可用的工作线程,这不会导致死锁。但这是一种不好的做法,应该避免,尽管如此。
关于ios - dispatch_sync里面的dispatch_sync导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23939730/
我有类似下面的代码: ... id: myComponent signal updateState() property variant modelList: [] Repeater { mo
我正在处理一些我无法展示的私有(private)代码,但我已经制作了一些示例代码来描述我的问题: 主.c: #include #include #include #include typede
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: what are the differences in die() and exit() in PHP? 我想
在编写 Perl 模块时,在模块内部使用 croak/die 是一个好习惯吗? 毕竟,如果调用者不使用 eval block ,模块可能会使调用它的程序崩溃。 在这些情况下,最佳做法是什么? 最佳答案
我有一些搜索线程正在存储结果。我知道当线程启动时,JVM native 代码会代理在操作系统上创建新 native 线程的请求。这需要 JVM 之外的一些内存。当线程终止并且我保留对它的引用并将其用作
我刚刚花了很多时间调试一个我追溯到 wantarray() 的问题。 .我已将其提炼为这个测试用例。 (忽略 $! 在这种情况下不会有任何有用信息的事实)。我想知道为什么wantarray在第二个示例
我看到一些代码是这样做的: if(something){ echo 'exit from program'; die; } ...more code 和其他只使用 die 的人: if
我正在尝试将此表格用于: 如果任何 $_POST 变量等于任何其他 $_POST 变量抛出错误。 如果只有几个,那不是问题,但我有大约 20 个左右所以如果我想这样做,我将不得不像这样 但这
每次我运行: hadoop dfsadmin -report 我得到以下输出: Configured Capacity: 0 (0 KB) Present Capacity: 0 (0 KB) DFS
我是一名优秀的程序员,十分优秀!