2012-01-05 57 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

相关问题