2012-01-14 2 views
2

2 차 스레드에 대한 dispatch_async 호출이 있으며 테스트 목적으로 5 초 동안 보조 스레드를 잠자 게하고 싶습니다. 이 여기에 코드입니다 : 나는 맥 OSX 라이온 10.7.2에서이 작업을 테스트 할 때sleep()은 iOS에서는 작동하지만 mac에서는 작동하지 않습니까?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    sleep(5); 
}); 

, 슬립() 함수는 잠을 스레드를 넣어하지 않습니다. 그리고 동일한 코드를 사용하는 iPhone 시뮬레이터에서 그렇습니다.

mac에서 sleep은 주 스레드에서 작동하고 [NSThread sleepUntilTimeInterval :]을 사용하는 보조 스레드에서 작동합니다.

잠자기() 기능이 Mac의 보조 스레드에서 작동하지 않는 이유는 무엇입니까? 감사합니다.

+0

[그랜드 센트럴 디스패치 대 NSThread] (http://stackoverflow.com/questions/5653522/grand-central-dispatch-vs-nsthread)와 [수면을 사용하지 않는 이유가 있습니까? 그랜드 센트럴 디스패치 대기열?] (http://stackoverflow.com/questions/4668634/iphone-is-it-ok-to-use-usleep-on-a-secondary-thread-on-grandcentral-dispatch) –

답변

4

글로벌 큐는 가능한 경우 여러 스레드에서 동시에 작업을 실행합니다. Mac은 대개 4-16 코어를 가지므로 대기열에 여러 작업자가있을 수 있습니다. 전역 대기열을 스레드 풀로 생각하는 것이 좋습니다.

대기열의 작업을 특정 순서로 실행하려면 직렬 대기열을 조사하는 것이 좋습니다.

2

ipc에 신호를 사용하고 있습니까?

모든 신호는 sleep()을 인터럽트하지만 [NSThread sleepForTimeInterval :]은 인터럽트하지 않습니다.

+0

sleep() 호출 후 뮤텍스를 사용하면 시그널을 고려해야할지 모르겠다. 하지만 어쨌든 iOS 용으로 동일한 코드가 작동합니다. –

+0

아니요, 뮤텍스는 신호가 아니며 신호는 교차 프로세스로 전달됩니다. 또한 iOS 환경에없는 Mac OS X 환경에서 cputhrottle과 같은 신호를 사용할 수도 있다고 생각했습니다. iOS 환경은 ipc에서 좀 더 제어됩니다. 이것은 막 다른 골목 일 수 있습니다. 그러나 sleep()과 같은 Posix 호출에서 [NSThread sleepForTimeInterval :]과 같은 코코아 특정 호출을 사용하는 이유 중 하나입니다. 네이티브 호출은 런타임 환경에 더 적합합니다. 플랫폼 Posix 라이브러리. –

0

sleep(5)이 iOS에서 실행되지 않는다는 것을 어떻게 알 수 있습니까? 블록의 sleep() 전이나 후에 아무 것도 보지 않고 스레드가 차단되지 않았 음을 나타내며 동시 대기열에 대해 dispatch_async()를 실행하면 현재 실행중인 스레드를 포함하여 실행중인 스레드가 비동기입니다. 디자인에 의해 결정적이기 때문에 그것에 대한 가정은하지 마십시오.

관련 문제