GCD 调度并发队列冻结,崩溃日志中'Dispatch Thread Soft Limit Reached: 64'



我的程序是一个处理传入请求的服务器。每个有效的请求都包装在NSOperation中,并传递给正常的NSOperationQueue

每个NSOpearation处理自己的请求。在某些情况下,在NSDictionary存在争用,我使用dispatch_queue(并发队列),dispatch_barrier_async(设置值时)和dispatch_sync(获取值时)使此NSDictionary线程安全。

我用100个并发请求测试我的程序,然后进程有时会冻结。我用SIGSEGV终止进程,以查看崩溃日志。

大多数线程卡在这个队列的dispatch_sync

下面有一个注释

分派线程软限制达到:64(分派线程太多)在同步操作中阻塞)

这张纸条到底是什么意思?它的行为是什么?我找不到关于这个极限的信息。我如何解决这个问题?

我能想到两种可能的方法来避免这个问题。(我将测试它们并稍后更新)
  1. 使用dispatch_semaphore限制提交块到并发队列。
  2. NSOperationQueue
  3. 限制maxConcurrentOperationCount
你有更好的解决办法吗?
我能想到两种可能的方法来避免这个问题。(我将测试它们并稍后更新)
  1. 使用dispatch_semaphore限制提交块到这个并发队列。
  2. 限制NSOperationQueuemaxConcurrentOperationCount .

是的,这是两种常见的模式。为了将来的读者,这个"耗尽工作线程"问题的另一个解决方案是Objective-C的dispatch_apply,也被称为concurrentPerform在Swift中,它允许并发操作的方式不会耗尽你的工作线程池。但这真的只适用于启动整个系列的任务在前面(例如,你想并行化一个for循环),而不是你在你的问题中概述的场景。但是,在记录中,dispatch_apply/concurrentPerform是这个一般问题的第三个常见解决方案。

我找不到有关此限制的信息。

这在WWDC 2012视频异步设计模式与块,GCD,和XPC中曾经被很好地覆盖,但那个视频不再可用(其他WWDC 2012视频,但不是那个,奇怪的是)。但是他们确实在WWDC 2015视频中用GCD构建响应性和高效的应用程序中讨论了有限的worker线程问题。

最新更新