2

在给定 NSOperationQueueDefaultMaxConcurrentOperationCount 最大并发设置的情况下,我正在寻找与创建 NSOperationQueue 的后台线程数相关的任何具体信息。

我曾假设采用某种负载监控来确定最合适的线程数,此外文档中建议使用此设置。我发现队列产生了大约 100 个后台线程,并且我的应用程序(在带有 iOS 5.1.1 的 iPad 3 上运行)与 SIGABRT 一起崩溃。我已将其减少到更可接受的数字,例如 3,并且一切正常。

任何意见或见解将不胜感激。

4

3 回答 3

3

我的经验与您的相匹配(尽管不是 100 个线程;请进行一些检测以确保您确实同时运行了这么多线程。我从未见过它如此之高)。除非你手动管理并发操作的数量,NSOperationQueue否则往往会产生过多的并发操作。(我还没有看到有人用可测试的代码而不是文档中的推论来反驳这一点。)对于可能产生大量潜在并发操作的任何事情,我建议使用setMaxConcurrentOperations. 虽然不理想,但我经常使用类似这样的功能来辅助(这当然不能帮助您在队列之间取得平衡,因此非常不理想):

unsigned int countOfCores() {
  unsigned int ncpu;
  size_t len = sizeof(ncpu);
  sysctlbyname("hw.ncpu", &ncpu, &len, NULL, 0);

  return ncpu;
}

我热切地等待任何人发布真实代码来演示NSOperationQueue自动为 CPU 绑定操作执行正确的负载平衡。我发布了一个示例要点,展示了我在说什么。如果不调用setMaxConcurrentOperations:,它将在 2 核 iPad 3 上生成大约 6 个并行进程。在这个没有争用或共享资源的非常简单的情况下,这会增加大约 10%-15% 的开销。在具有争用的更复杂的代码中(尤其是在操作可能被取消的情况下),它可以使事情变慢一个数量级。

于 2012-08-13T18:50:02.593 回答
1

假设您的线程忙于工作,那么双核 iPad 上的一个进程中有 100 个活动线程是不合理的。每个线程都会消耗大量的时间和内存。拥有这么多繁忙的线程会减慢双核的速度。

无论您是否在做一些愚蠢的事情(比如让他们全部睡觉或添加运行循环或只是让他们无事可做),这将是一个错误。

于 2012-08-13T18:40:42.173 回答
0

从文档中:

默认的最大操作数由 NSOperationQueue 对象根据当前系统条件动态确定。

iPad 3 拥有强大的处理器和 1Gb 的内存。由于 NSOperationQueue 是根据系统条件来计算线程的数量,所以很有可能它根据该设备上可用的功率确定能够运行大量的 NSOperation。它崩溃的原因可能与同时运行的线程数量无关,而与在这些线程中执行的代码有关。检查回溯并查看这些踏板之间是否共享某些条件或资源。

于 2012-08-13T18:14:23.687 回答