6

我的程序是一个处理传入请求的服务器。每个有效的请求都被包装NSOperation并传递给一个普通的NSOperationQueue.

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

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

大多数线程都停留在dispatch_sync此队列中。并且下面有一个注释

已达到调度线程软限制:64(同步操作中阻塞的调度线程过多)

这个注释的真正含义是什么?它的行为是什么?我找不到有关此限制的信息。我该如何解决这个问题?

我可以想到两种可能的方法来避免这个问题。(我将对其进行测试并将稍后更新)

  1. 用于dispatch_semaphore限制将块提交到此并发队列。
  2. maxConcurrentOperationCount的限制NSOperationQueue

你有更好的解决方案吗?

4

1 回答 1

0

我可以想到两种可能的方法来避免这个问题。(我将对其进行测试并将稍后更新)

  1. 用于dispatch_semaphore限制将块提交到此并发队列。
  2. 的极限maxConcurrentOperationCountNSOperationQueue

是的,这是两种常见的模式。为了未来的读者,这个“耗尽工作线程”问题的另一个解决方案是 Objective-C dispatch_apply,在 Swift 中也被称为concurrentPerform,它允许以不会耗尽工作线程池的方式进行并发操作。但这实际上只适用于预先启动一系列任务(例如,您想要并行化一个for循环),而不是您在问题中概述的场景。但是,为了记录,dispatch_apply/仍然concurrentPerform是这个一般问题的第三个常见解决方案。

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

这曾经在 WWDC 2012 视频Asynchronous Design Patterns with Blocks、GCD 和 XPC中得到很好的介绍,但该视频不再可用(奇怪的是,其他 WWDC 2012 视频有,但不是那个)。但他们确实解决了 WWDC 2015 视频Building Responsive and Efficient Apps with GCD中有限的工作线程问题。

于 2019-01-06T22:31:40.460 回答