gpt4 book ai didi

multithreading - GCD 调度并发队列卡住,崩溃日志中为 'Dispatch Thread Soft Limit Reached: 64'

转载 作者:行者123 更新时间:2023-12-04 16:11:27 25 4
gpt4 key购买 nike

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

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

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

大多数线程卡在dispatch_sync这个队列。下面有一个注释

Dispatch Thread Soft Limit Reached: 64 (too many dispatch threads blocked in synchronous operations)



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

我可以想到两种可能的方法来避免这个问题。 (我将对其进行测试,稍后会更新)
  • 使用 dispatch_semaphore限制提交块到这个并发队列。
  • 限时maxConcurrentOperationCountNSOperationQueue

  • 你有更好的解决方案吗?

    最佳答案

    I can think of 2 possible ways to avoid this problem. (which I'm going to test them and will update later)

    1. Use dispatch_semaphore to limit submitting the block to this concurrent queue.
    2. Limit maxConcurrentOperationCount of the NSOperationQueue.


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

    I cannot find information about this limit.



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

    关于multithreading - GCD 调度并发队列卡住,崩溃日志中为 'Dispatch Thread Soft Limit Reached: 64',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027824/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com