【问题标题】:Can you call dispatch_sync from a concurrent thread to itself without deadlocking?你可以从一个并发线程调用dispatch_sync而不死锁吗?
【发布时间】:2015-06-16 06:48:05
【问题描述】:

我知道在串行队列上执行此操作会导致死锁,但我没有发现任何提及在并发队列上执行此操作会导致死锁的内容。我只是想验证它不会死锁(它似乎不会死锁,因为它只会阻塞队列中的一个线程,而任务会在同一个队列的另一个线程上运行)

另外,您是否可以通过在并发队列上调用 dispatch_sync 来控制执行顺序? (提到了here)我不明白为什么会发生这种情况,因为异步与同步与调用者线程有关。

【问题讨论】:

  • 谢谢,但这更像是一个普遍的问题,而不是我遇到的问题。
  • 除非你能绝对保证不是所有线程最终都会同时等待某个东西,否则就会出现死锁风险——你怎么能保证呢?

标签: ios objective-c multithreading swift grand-central-dispatch


【解决方案1】:

这不会死锁,因为分派的块可以立即开始运行 - 它不是串行队列,因此不必等待当前块完成。

但这仍然不是一个好主意。这将阻塞一个线程,导致操作系统启动一个新线程(因为它仍然有空闲的 CPU,因为线程正在休眠)浪费内存。

【讨论】:

  • 谢谢斯文!!那么关于执行顺序控制的问题的第二部分呢?看起来不太对劲。
  • GCD 完全有权在当前线程中运行块,在对dispatch_sync() 的调用中。 (不是必须,但可以。)
  • 对,我忘了。
  • 谢谢!那么dispatch_sync 将如何像这里提到的那样一个接一个地执行块? stackoverflow.com/questions/19179358/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 2012-01-01
相关资源
最近更新 更多