Grand Central Dispatch与NSThread
|
我为NSThread和Grand Central Dispatch(GCD)创建了一些测试代码:
- (void)doIt:(NSNumber *)i
{
sleep(1);
NSLog(@\"Thread#%i\", [i intValue]);
}
- (IBAction)doWork:(id)sender
{
for (int i = 0; 10 > i; i++) {
NSNumber *t = [NSNumber numberWithInt:i];
[NSThread detachNewThreadSelector:@selector(doIt:) toTarget:self withObject:t];
}
sleep(1);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(10, queue, ^(size_t i) {
sleep(1);
NSLog(@\"GCD#%u\",(int)i);
});
}
结果:
2011-04-13 19:41:07.806 GDC[1494:5e03] Thread#0
2011-04-13 19:41:07.813 GDC[1494:6903] Thread#3
2011-04-13 19:41:07.812 GDC[1494:6403] Thread#2
2011-04-13 19:41:07.812 GDC[1494:5f03] Thread#1
2011-04-13 19:41:07.813 GDC[1494:6e03] Thread#4
2011-04-13 19:41:07.814 GDC[1494:7303] Thread#5
2011-04-13 19:41:07.814 GDC[1494:7803] Thread#6
2011-04-13 19:41:07.815 GDC[1494:7d03] Thread#7
2011-04-13 19:41:07.815 GDC[1494:8203] Thread#8
2011-04-13 19:41:07.816 GDC[1494:8703] Thread#9
2011-04-13 19:41:08.812 GDC[1494:707] GCD#0
2011-04-13 19:41:09.816 GDC[1494:707] GCD#1
2011-04-13 19:41:10.819 GDC[1494:707] GCD#2
2011-04-13 19:41:11.825 GDC[1494:707] GCD#3
2011-04-13 19:41:12.828 GDC[1494:707] GCD#4
2011-04-13 19:41:13.833 GDC[1494:707] GCD#5
2011-04-13 19:41:14.838 GDC[1494:707] GCD#6
2011-04-13 19:41:15.848 GDC[1494:707] GCD#7
2011-04-13 19:41:16.853 GDC[1494:707] GCD#8
2011-04-13 19:41:17.857 GDC[1494:707] GCD#9
NSThreads按我的预期工作:任务同时运行,每个线程睡眠1秒。
dispatch_apply无法按我预期的方式工作:为什么订单是顺序的?为什么每个循环都等到前一个循环结束?
谢谢您的帮助。
没有找到相关结果
已邀请:
3 个回复
感秆暴壳
而不是
会有很大的不同。这是我使用的代码:
如您所见,我将
呼叫替换为
循环,这花费了一些时间。 (我在MacBook Pro上运行了代码-如果在iPhone上运行,您可能想向下调整
的值。)如果在线程和块中都使用
,则
会使块起作用就像线程一样-所有块同时运行并大约同时完成。切换到计数更改行为-多个线程全部同时运行,但这些块按组执行(我的机器有两个处理器内核,因此它以两个为一组运行这些块)。这正是您所期望的; GCD的工作是将任务排入队列并尽快完成它们,以充分利用可用资源,而不是同时运行尽可能多的任务。 这是上面代码的输出:
请注意,除了一个线程外,其中两个块实际上已在所有线程之前完成。另外:代码末尾的“ 11”仅用于使线程和块在程序终止之前记录其消息。根据您将代码粘贴到哪种程序中,您可能不需要它。
夏瓤跋棘
?
豆兢