당신은 호출 할 필요는 없다 :
#include <dispatch/dispatch.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_time_t dispatchTime = dispatch_time(DISPATCH_TIME_NOW, 5LL * NSEC_PER_SEC);
dispatch_after(dispatchTime, globalQueue, ^{
printf("Dispatched on global queue\n");
exit(0);
});
dispatch_main();
return (0);
}
이 사용을 컴파일하려면 디스패처를 시작할 수있는 아무 것도 없지만 대기열에서 불완전한 작업이있는 경우 주 스레드를 종료 할 수 없거나 프로그램이 종료됩니다. 아무튼 (
대신 세마포어의
int main() {
__block int count = 10;
dispatch_semaphore_t done = dispatch_semaphore_create(0);
dispatch_time_t naptime;
// timeout after 5 seconds
naptime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)5E9);
// no timeout
//naptime = dispatch_time(DISPATCH_TIME_FOREVER, 0);
// schedule some work
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),
^{
dispatch_apply(count, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0),
^(size_t i){
//...
// note: potential race condition on count.
// Synchronization left as an exercise.
if (--count == 0) {
dispatch_semaphore_signal(done);
}
}
);
}
);
if (dispatch_semaphore_wait(done, naptime)) {
// processing didn't complete in allotted time
//...
}
dispatch_release(done);
return 0;
}
는, 잠을 호출하거나 루프에서 엄청난 수에 계산의 개념적으로 쉽게 미만 사용 가능한 방법이 확실 컴파일러를 만들 : 당신은 사용하여 세마포어에 의해 종료에서 메인 스레드를 방지 할 수 있습니다 최적화하지 않거나 변수가 처리 될 때 true로 설정 될 때까지 루핑됩니다 (busy-wait). 이들 각각은 심각한 결함이 있으며 세마포보다 덜 바람직합니다.
직렬 대기열을 만들고이를 몇 번 호출 한 다음 dispatch_sync를 호출 한 다음 프로그램을 종료하여 테스트 할 수도 있습니다.
는 전에 시작 dispatch_main 할 수있는 runloop을 을 시작할 수 있습니다 주요 큐를 제외하고 당신이 어떤 큐에 보내 알고 일을 dispatch_main 호출하거나 실행 루프를 시작하지만 할 좋은 이유가 있습니다.
dispatch_main 호출이 필요하지 않습니다. 예를 들어 10 초간 수면으로 바꾸면 5 초 타이머가 계속 트리거됩니다. – Stripes