2011-11-18 93 views
3

我有这款应用程序是在iPhone 4启动时为iPhone 4创建的。现在,这个应用程序没有在iPhone 4S上运行。iPhone - Grand Central Dispatch在iPhone 4S上无法正常工作

我已经确定罪魁祸首部分为GCD部分。这里是:

dispatch_group_t my_group = dispatch_group_create(); 

dispatch_queue_t queue1 = 
     dispatch_queue_create("Queue 1", NULL); 

dispatch_queue_t queue2 = 
     dispatch_queue_create("Queue 2", NULL); 


dispatch_group_async(my_group, queue1, ^{ 
     [self doStuff1]; 
}); 

dispatch_group_async(my_group, queue2, ^{ 
     [self doStuff2]; 
}); 

dispatch_group_notify(my_group, dispatch_get_main_queue(), ^{ 
// this is block 3, this is to be executed after both queues end processing 
// this is never executed on iPhone 4S, but is executed on iPhone4 
// no error message, but execution never starts inside this block 
}); 

想法是这样的:创建两个队列和一个组。我使用组来异步​​地为这两个队列发送任务。当两者都完成后,该组发射另一块任务。

这项工作奇妙的iPhone 4,但最终块3永远不会到达。

有什么理由呢?任何线索?

谢谢。

回答

5

也许doStuff1doStuff2是死锁,或其他东西阻塞主线程? 4S具有多个内核,与4不同,所以可能会遇到一些您以前从未见过的多线程锁定问题。

您确定两个块都实际完成,并且主线程可用于运行结果块吗?也许一些完整的代码(即doStuff1和2的主体)会有所帮助?

+2

在iPad 2上运行测试多核理论的一种方法(这也是我的猜测)。从来没有线程问题的保证,但它们确实倾向于使用多核心更容易地暴露出来。 –

+0

@DavidDunham - 在多核Mac上运行时,我还在iOS Simulator中暴露了类似的错误。这是模拟器可以派上用场的其中一例。您还可以使用CPUPalette应用程序在Mac上实时打开和关闭核心,但我现在无法在Lion系统上找到它。 –

+0

@BradLarson这个代码的问题在于我不能使用模拟器,因为它需要coremotion和一些硬件功能。 – SpaceDog

2

我要做的第一件事是将代码更改为dispatch_async queue1上的所有内容;显然,你不会得到并发性,但是如果问题立即消失,会立即知道dostuff1和dostuff2是否以某种方式相互冲突。在单个核心机器上,这可能是您以前实际看到的执行行为。

相关问题