我的程序是一个处理传入请求的服务器。每个有效的请求都包装在NSOperation
中,并传递给正常的NSOperationQueue
。
每个NSOpearation
处理自己的请求。在某些情况下,在NSDictionary
存在争用,我使用dispatch_queue
(并发队列),dispatch_barrier_async
(设置值时)和dispatch_sync
(获取值时)使此NSDictionary
线程安全。
我用100个并发请求测试我的程序,然后进程有时会冻结。我用SIGSEGV
终止进程,以查看崩溃日志。
大多数线程卡在这个队列的dispatch_sync
。
分派线程软限制达到:64(分派线程太多)在同步操作中阻塞)
这张纸条到底是什么意思?它的行为是什么?我找不到关于这个极限的信息。我如何解决这个问题?
我能想到两种可能的方法来避免这个问题。(我将测试它们并稍后更新)- 使用
dispatch_semaphore
限制提交块到并发队列。 -
NSOperationQueue
限制
maxConcurrentOperationCount
我能想到两种可能的方法来避免这个问题。(我将测试它们并稍后更新)
- 使用
dispatch_semaphore
限制提交块到这个并发队列。- 限制
NSOperationQueue
的maxConcurrentOperationCount
.
是的,这是两种常见的模式。为了将来的读者,这个"耗尽工作线程"问题的另一个解决方案是Objective-C的dispatch_apply
,也被称为concurrentPerform
在Swift中,它允许并发操作的方式不会耗尽你的工作线程池。但这真的只适用于启动整个系列的任务在前面(例如,你想并行化一个for
循环),而不是你在你的问题中概述的场景。但是,在记录中,dispatch_apply
/concurrentPerform
是这个一般问题的第三个常见解决方案。
我找不到有关此限制的信息。
这在WWDC 2012视频异步设计模式与块,GCD,和XPC中曾经被很好地覆盖,但那个视频不再可用(其他WWDC 2012视频,但不是那个,奇怪的是)。但是他们确实在WWDC 2015视频中用GCD构建响应性和高效的应用程序中讨论了有限的worker线程问题。