等待NSThread

时间:2011-01-30 20:50:21

标签: iphone winapi ipad ios

我有很多NSThreads,我想在他们工作的时候睡觉。我该怎么做? iOS SDK中是否存在类似WinApi函数的WaitForSingleObject / WaitForMultipleObjects?

2 个答案:

答案 0 :(得分:6)

有很多方法,但我的主要建议是研究使用libdispatch。

而不是产生NSThreads:

dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    /* work to do in a thread goes here */
});
/* repeat for other threads */
dispatch_group_wait(group, DISPATCH_TIME_FOREVER); //wait for all the async tasks in the group to complete

有关文档,请参阅http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_group_async.3.html

另一种方法是使用信号量,posix或dispatch(http://www.csc.villanova.edu/~mdamian/threads/posixsem.html有一些信息,http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html)。

(编辑后再添加一个替代方案):

如果您的所有线程基本上完成相同的工作(即拆分任务而不是执行大量不同的任务),这也可以很好地工作,并且更简单:

dispatch_apply(count, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t i){
 doWork(someData, i);
});

答案 1 :(得分:0)

听起来你应该重新考虑你的应用程序的架构。拥有许多线程,特别是在iOS上,几乎可以保证比较简单的设计更慢,更明确地说,比较简单。

在iOS上,只有一个核心,总​​线带宽非常有限。

尽可能使用更高级别的系统提供的并发工具(NSOperation,dispatch和任何异步API)会更好。