2012-01-05 58 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核心,我並非百分之百確定,但併發隊列的線程數量是有限的。

+0

所以你說,被阻塞的線程不會返回到線程池,因此如果有很多線程被阻塞的話,線程用盡的風險相當大。一般來說,標準隊列中每個CPU核心只有一個線程可用?有沒有人有文檔的參考來支持這個? – Twilite 2012-03-22 09:35:06

+0

隨着線程的阻塞,我很確定,你應該總是避免這種情況。每個併發隊列的線程數量在某種程度上侷限於CPU的數量,這只是我做過的一個觀察。但是,我對此並不十分確定。我試圖找到一些參考。 – 2012-03-22 09:44:19

相關問題