GCD创建的线程数?

ste*_*ete 26 grand-central-dispatch ios

关于GCD创建了多少个线程,是否有任何好的文档?在WWDC,他们告诉我们它是围绕CPU核心建模的.但是,如果我称这个例子:

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

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

小智 31

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

其次,GCD并不神奇.它经过优化,可以使CPU忙于主要受CPU限制的代码.GCD的"神奇之处"在于,当工作项无意中并且短暂地等待操作完成时,它会动态创建比CPU更多的线程.

话虽如此,代码可以通过故意睡眠或等待事件而不是使用调度源等待事件来混淆GCD调度程序.在这些场景中,工作块有效地实现了自己的调度程序,因此GCD必须假定线程已从线程池中选择.

简而言之,如果您的代码更喜欢dispatch_after()而不是"sleep()"(如API),并通过手工制作的事件循环(Unix select()/ poll(),Cocoa runloops或POSIX条件变量)调度源,则线程池将以最佳方式运行. .