2011-01-27 60 views
2

我知道GCD只会根据需要创建尽可能多的线程来充分利用CPU。在使用dispatch_async启动约30个后台任务的代码中,我看到活动监视器中的线程数量跳过了大约30个。我不会期望的,因为它只是一个双核心PC。Grand Central Dispatch应该创建多少个线程?

我确定我误解了一些东西。有人能告诉我发生了什么事吗?

+1

你的调度块,呃,块?也就是说,他们做文件系统/网络I/O吗? – 2011-01-27 21:25:58

回答

5

GCD通过添加更多线程来增加线程池的一种情况是I/O争用。如果调度块等待文件系统或网络I/O,则它不使用CPU,因此GCD认为CPU处于空闲状态并且能够处理更多线程。

实际上,根据调度块的性质,这可能会进一步增加I/O争用并达到512个工作线程的限制。关于这种情况,Mike Ash写了一个blog post

+0

啊,有趣。这些线程正在调用`AXUIElememt ...`函数来检查其他应用程序,这似乎需要应用程序的合作(尽管我从来没有完全了解它的工作原理)。这可能是阻塞原因的后面。 – 2011-01-27 21:43:47

相关问题