NSOperationQueueDefaultMaxConcurrentOperationCount的线程数

时间:2012-08-13 18:03:44

标签: iphone multithreading macos concurrency

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

我曾假设采用某种负载监控来确定最适合生成的线程数,并且在文档中建议使用此设置。我发现,队列产生大约100个后台线程,我的应用程序(在iOS 3上运行的iOS 3)与SIGABRT崩溃。我把它减少到一个更可接受的数字,如3,一切都很好。

任何评论或见解都将受到赞赏。

3 个答案:

答案 0 :(得分: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绑定操作执行正确的负载平衡。我发布了sample gist来证明我在说什么。如果不调用setMaxConcurrentOperations:,它将在2核iPad 3上产生大约6个并行进程。在这种非常简单的情况下,没有争用或共享资源,这会增加大约10%-15%的开销。在具有争用的更复杂的代码中(特别是如果操作可能被取消),它可以使事情减慢一个数量级。

答案 1 :(得分:1)

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

无论你是在做些傻事(比如全部睡觉还是添加跑步圈或只是让他们无事可做),这都是一个错误。

答案 2 :(得分:0)

来自文档:

  

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

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