Grand Central Dispatch vs. NSThread Grand Central Dispatch(GCD)和NSThread是iOS中用于多线程编程的两种不同的技术。 GCD是一种高级的抽象层,可以自动管理线程的创建、调度和销毁。它使用队列(Dispatch Queue)来管理任务,并根据系统资源的可用性自动调整线程数量。GCD提供了多种类型的队列,包括串行队列(Serial Queue)和并行队列(Concurrent Queue),以及全局队列(Global Queue)。使用
Grand Central Dispatch vs. NSThread Grand Central Dispatch(GCD)和NSThread是iOS中用于多线程编程的两种不同的技术。 GCD是一种高级的抽象层,可以自动管理线程的创建、调度和销毁。它使用队列(Dispatch Queue)来管理任务,并根据系统资源的可用性自动调整线程数量。GCD提供了多种类型的队列,包括串行队列(Serial Queue)和并行队列(Concurrent Queue),以及全局队列(Global Queue)。使用
我为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的工作并不符合我的预期:为什么顺序是连续的?为什么每个循环都要等待前一个循环完成?
谢谢您的帮助。
Grand Central Dispatch(GCD)和NSThread都是iOS中用于处理多线程的技术。然而,这两种方法之间存在一些区别,可能会影响到程序的性能和表现。
在上述代码中,我们可以看到两种方法的使用。首先,使用了NSThread来创建并发线程,每个线程都执行相同的任务。然后,使用了GCD中的dispatch_apply函数,以及dispatch_async函数来执行相同的任务。
问题的出现原因可以归结为对于特定问题,哪种方法更加高效和可靠的问题。解决方法是使用上述代码进行测试,并比较两种方法的执行时间和表现。
通过运行上述代码,我们可以得到结果。在执行时间方面,GCD的表现更好,因为它能够更好地管理线程池和任务队列,以及更好地利用系统资源。而NSThread的表现则相对较差,因为它需要手动管理线程的生命周期和线程池。
因此,根据测试结果,我们可以得出结论:对于大多数情况下,使用GCD是更好的选择,因为它提供了更高效和可靠的多线程处理方式。然而,对于一些特定的问题,可能需要使用NSThread来实现更加细粒度的线程控制。
总结起来,Grand Central Dispatch和NSThread都是iOS中处理多线程的技术,但在性能和表现方面存在一些差异。通过测试和比较两种方法,我们可以选择最适合特定问题的方法来实现多线程处理。
Grand Central Dispatch (GCD)和NSThread是iOS中用于多线程编程的两种不同的方式。GCD是苹果提供的一种并发编程框架,而NSThread是一种基于线程的方式。
在上述内容中,提到了为什么会出现Grand Central Dispatch vs. NSThread这个问题,以及解决方法。首先,由于设备只有一个处理器,GCD可能只会创建一个线程来执行块,因此块会按顺序执行。然而,创建了10个不同的线程,这些线程每个都会获得一小部分的可用处理时间。幸运的是,睡眠并不占用太多的处理器资源,所以所有的线程能够很好地同时运行。但是,在拥有4或8个处理内核的机器上进行类似的测试,你会发现GCD会更多地并行运行你的块。
GCD的好处不在于它比线程提供更好的性能,而是程序员不需要考虑创建线程或者匹配线程数量与可用处理器数量。你可以创建很多小任务,它们会在处理器可用时执行,并让系统为你安排这些任务的调度。
在代码中,使用了dispatch_async()代替了dispatch_apply(),并且将sleep()函数替换为了计数循环。这样做的目的是让块的行为与线程相似。如果在线程和块中都使用sleep()函数,那么dispatch_async()会使块的行为与线程完全一致,所有的块都并行运行,并且大致同时完成。而如果切换到计数循环,情况就会有所不同,多个线程都会并发运行,但是块会分组执行。这是符合预期的,因为GCD的任务是将任务排队并尽快完成,以最大限度地利用可用资源,而不是并行运行尽可能多的任务。
GCD并不是无用的,它可以在iOS设备上使用。你可以尝试使用dispatch_async()来代替dispatch_apply(),这样可以更好地利用GCD的特性。在处理低负载任务时,可以选择使用NSThread,而在处理高负载任务时,可以选择使用GCD。
Grand Central Dispatch(GCD)和NSThread是IOS平台上处理多线程的两种方式。下面的内容提到了一些关于使用GCD的问题和解决方法。
在IOS环境下,使用dispatch_apply
时,它会根据传入的队列来确定执行方式。如果目标队列是通过dispatch_get_global_queue
返回的并发队列(这是您的情况),则可以并发地调用该块。所以,作者认为它是有效的,只是碰巧以异步方式运行。此外,代码运行的设备可能会对结果产生影响。但是作者建议尝试使用dispatch_async
来替代。
上面提到的链接是关于Mac的参考文档,与标记为iOS的参考文档不同。针对iOS的参考文档中提到,如果目标队列是通过dispatch_get_global_queue返回的并发队列,块可以并发地调用,并且必须是可重入安全的。在并发队列上使用此函数可以作为高效的并行for循环。
原作者承认自己在回答该问题时犯了错误,他错误地假设该问题是关于cocoa而不是iOS的。
这段内容提到了使用GCD时可能遇到的问题和解决方法。