2011-11-18 2 views
3

iPhone 4를 실행할 때이 앱을 만들었습니다. 자,이 응용 프로그램은 아이폰 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 시뮬레이터에서 이와 같은 버그를 노출했습니다. 이것은 시뮬레이터가 유용 할 수있는 경우 중 하나입니다. 또한 CPUPalette 응용 프로그램을 사용하여 Mac에서 즉시 코어를 켜고 끌 수 있었지만 지금은 내 Lion 시스템에서 코어를 찾을 수 없습니다. –

+0

@BradLarson이 코드의 문제점은 coremotion과 일부 하드웨어 기능이 필요하기 때문에 시뮬레이터를 사용할 수 없다는 것입니다. – SpaceDog

2

먼저 할 일은 queue1의 모든 코드를 dispatch_async로 변경하는 것입니다. 분명히 동시성을 얻지는 못하지만 문제가 즉시 사라지면 dostuff1과 dostuff2가 어떻게 든 충돌하는지 즉시 알 수 있습니다. 단일 코어 머신에서 이것은 아마도 실제로 당신이 실제로 본 실행 행동 일 것입니다.

관련 문제