【问题标题】:Thread starvation when using dispatch_semaphore_wait inside dispatch queue?在调度队列中使用 dispatch_semaphore_wait 时线程饥饿?
【发布时间】:2012-03-22 03:52:38
【问题描述】:

如果我在调度队列中使用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]);
});

【问题讨论】:

    标签: objective-c grand-central-dispatch


    【解决方案1】:

    据我所知,您的假设是正确的。 dispatch_semaphore_wait 的调用阻塞了正在执行的线程。我在类似的情况下遇到了这个问题,并发现并发队列为每个内核创建了两个线程(以及每个优先级)。我不确定是 2 * cpu cores 还是 1 * cpu cores,但并发队列的线程数是有限的。

    【讨论】:

    • 所以你说,被阻塞的线程不会被返回到线程池,因此如果有很多线程被阻塞,那么线程耗尽的风险就会很大。一般来说,标准队列上的每个 CPU 核心只有一个线程可用?有没有人参考文档来支持这一点?
    • 由于线程阻塞,我很确定,您应该始终避免这种情况。每个并发队列的线程数在某种程度上受限于 CPU 的数量,这只是我所做的一个观察。但对此我不确定。我试着找一些参考资料。
    猜你喜欢
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多