GCD创build的线程数量?

GCD创build了多less个线程有没有很好的文档? 在WWDC上,他们告诉我们这是围绕CPU核心build模的。 但是,如果我称这个例子:

for (int i=1; i<30000; i++) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [NSThread sleepForTimeInterval:100000]; }); } 

它打开了66个线程,即使在iPad1上也是如此。 (它本身也在Lion上调用时打开66个线程)。 为什么66?

首先,66 == 64(最大GCD线程池大小)+主线程+其他一些非GCD线程。

其次,GCD不是魔术。 它针对保持CPU忙于大部分CPU绑定的代码而进行了优化。 GCD的“魔力”在于,当工作项目无意中暂时等待操作完成时,它会dynamic创build比CPU更多的线程。

话虽如此,代码可能会混淆GCD调度程序故意睡觉或等待事件,而不是使用调度源等待事件。 在这些情况下,工作块有效地实现了自己的调度器,因此GCD必须假设线程池已经被select了线程。

简而言之,如果你的代码比API更像“sleep()”,并且通过手工事件循环(Unix select()/ poll(),Cocoa runloops或POSIX条件variables)调度dispatch_after() 。

文档避免提到创build的线程数量。 主要是因为线程的最佳数量在很大程度上取决于上下文。

Grand Cendral Dispatch的一个问题是,如果正在运行的任务被阻塞,它将产生一个新的线程。 也就是说,当使用GCD的线程多于核心不理想时,应该避免阻塞。

在你的情况下,GCD检测到任务是不活动的,并为下一个任务产生一个新的线程。

为什么66是极限超越了我。