|
1
5
简短回答: 是的,使用信号量可能会导致死锁,但不是出于你建议的原因。 长答案: 如果你有一些分派的任务在等待信号量,那么该工作线程会被阻塞,直到收到信号,它会恢复执行并随后返回。因此,您不必担心另一个分派的任务试图使用同一线程,因为该线程已从线程池中临时删除。你永远不必担心两个分派的任务试图同时使用同一个线程。这不是僵局的风险。 话虽如此,我们必须对线程池中的工作线程数量极其有限(目前每个QoS 64个)这一事实保持敏感。如果你耗尽了可用的工作线程,那么分派给GCD的任何其他任务(具有相同的QoS)都无法运行,直到之前被阻塞的一些工作线程再次可用为止。 考虑:
这很好。你有十个工人线程与这些线程绑定在一起
但是,如果你增加
顺便说一句,在线程爆炸场景中使用信号量只是导致死锁的一种特殊方式。但为了完整起见,值得注意的是,有很多方法可以与信号量死锁。最常见的例子是使用信号量(或调度组或其他任何东西)来等待一些异步进程,例如。
如果(a)从主队列运行它,则可能会死锁;但是(b)异步方法也恰好在主队列上调用其完成处理程序。这是典型的信号量死锁。 我只使用了上面的线程爆炸示例,因为死锁并不完全明显。但很明显,有很多方法会导致信号量死锁。 |
|
|
Danil · 种子/填充核心数据的最佳实践?[关闭] 1 年前 |
|
|
Robin · LazyVGrid项目预计不会击中测试区域 1 年前 |
|
|
Alex Smith · 移动到下一个视图控制器后如何显示警报? 1 年前 |
|
selcukctn · 如何在react native中制作无限动画? 1 年前 |
|
|
Nicolas Gimelli · iOS 18远程通信通知不起作用 1 年前 |