2012-06-13 3 views
2

방금 ​​this answer (답은 삭제되었습니다)으로 읽었습니다. 매달린 후에 앱이 다운 된 것을 본 적이있어서 읽었습니다.스레드 차단 목표 C

메인 스레드를 너무 오래 차단하면 OS가 앱을 종료합니다.


그러나 나는 몇 가지 검사를 쓴 그들 중 누구도 각각 약 2-5 분을 기다린 후 충돌 앱의 원인이 없다는 것을 발견했다. 중단 점은 내가 메인 스레드에서 실행 중임을 확인했습니다.

  • 누군가 내가 읽은 것을 확인하거나 반증 할 수 있습니까? 아니면 방금 차단되지 않은 많은 옵션을 선택 했습니까?

  • 차단되지 않은 옵션을 선택했다면 누군가 차단할 수없는 이유를 설명 할 수 있습니까?


while (true) { /*Nothing*/ } 

while (true) { NSLog(@"nothing"); } 

for(;;); 

sleep(100000000); 

,
while(true) { sleep(1); } 
+0

편집자 : 선은 별도의 테스트를 나타내는 것을 의도적으로 나타냅니다. 코드가 그룹화되지 않아야합니다. –

답변

2

application:didFinishLaunchingWithOptions: 또는 applicationDidEnterBackground:과 같이 UIApplicationDelegate 개의 메소드에서 너무 오래 걸리는 경우 iOS에서 앱을 죽일 수 있습니다. 디버그 버전의 응용 프로그램에는 적용되지 않지만 일반적으로 반환하는 데는 5 초가 걸립니다.

이러한 메서드 외부에서 주 스레드를 차단해도 응용 프로그램이 종료되지 않습니다.

+0

고맙습니다. 내가 작성한 코드가 차단 되었습니까?다른 대답은 아니오를 제안하는 것으로 보인다. –

+0

차단하는 것이 의미하는 바에 달려 있습니다. 게시 한 각 줄이 스레드에 의해 실행될 때 그 스레드는 거기에 갇히고 계속 이동하지 않습니다. 기술적으로 'sleep (100000000);'줄은 1157 일 후에 반환됩니다. –

+1

그 때 나는 기다리고있는 어떤 사람들이있다! 해명 해줘서 고마워. –

0

당신이 말하는 답변이 정확하지 않습니다. 그는 메모리가 부족하여 충돌을 일으켰습니다. 메인 스레드를 차단 한 것이 아니기 때문입니다. 당신이 부여한 예제가 그 스레드를 막지 못한다고 나는 믿는다. 스레드를 실제로 차단하는 방법은 재귀를 사용하거나 주 스레드에서 main queue를 인수로 사용하여 dispatch_sync를 호출하는 것입니다. 이렇게하면 교착 상태가 발생하지만 응용 프로그램이 종료 될 것이라고 생각하지는 않습니다 (잘못되었지만).

왜 이러한 차단이되지 않습니까? 차단 정의 방법에 따라 다릅니다. 4 번째를 제외하고 제공 한 모든 예제는 코드가 다음 줄로 진행되는 것을 막을뿐입니다. sleep(10000000)은 주어진 시간 (초)이 지나면 정상적으로 돌아 오기 때문에 이보다 약한 편입니다. 왜 이것이 문제가되는 것입니까?

+0

그래, 그 질문에 대한 다른 대답을 썼습니다. 그러나 어쨌든 나는 블로킹을하고 있지 않다는 것을 깨닫기에 흥미가있다. –

+2

그들은 진행을 방해한다. 잠들지 만 스레드가 실행 가능하지 않다는 의미로 모든 블록이 차단되는 것은 아닙니다. 그들 중 일부는 영원히 바쁜 루프에 의해 차단됩니다. –