2012-01-05 2 views
2

디스패치 큐에 dispatch_semaphore_wait을 사용하는 경우 많은 스레드가 dispatch_semaphore_wait에서 차단되는 경우 스레드의 디스패치 큐가 굶어 질 수 있습니까?디스패치 대기열에서 dispatch_semaphore_wait를 사용할 때 스레드 고갈?

parallelDownloadsSemaphore = dispatch_semaphore_create(4); 

[...] 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ 
    dispatch_semaphore_wait([self parallelDownloadsSemaphore], DISPATCH_TIME_FOREVER); 
    // perform lengthy download 
    dispatch_semaphore_signal([self parallelDownloadsSemaphore]); 
}); 

답변

0

귀하는 내가 아는 한 올바르게합니다. dispatch_semaphore_wait의 호출은 실행중인 스레드를 차단합니다. 비슷한 상황에서이 문제가 발생하여 각 코어에 대한 두 개의 스레드가 동시 대기열 (각 우선 순위에 대해)을 생성한다는 것을 알아 냈습니다. 나는 2 * cpu 코어 또는 1 * cpu 코어라면 100 % 확신 할 수 없지만 동시 대기열에 대한 스레드 수는 제한적입니다.

+0

차단 된 스레드가 스레드 풀로 반환되지 않으므로 많은 스레드가 차단 된 경우 스레드가 부족할 위험이 있습니다. 그리고 일반적으로 표준 큐의 CPU 코어 당 하나의 스레드 만 사용할 수 있습니까? 누구든지이 문서를 참조 할 수 있습니까? – Twilite

+0

스레드의 차단으로 나는 꽤 확신하고 항상 이것을 피해야합니다. 동시 대기열 당 스레드 수는 어떻게 든 CPU 수로 제한된다는 것은 내가 한 일이었습니다. 그러나 이것으로 나는 절대적으로 확신 할 수 없다. 나는 약간의 참고 문헌을 찾으려고 노력한다. –

관련 문제