2012-01-05 4 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つのスレッドが同時に(各優先度ごとに)作成されることを確認しました。私は2 * cpuコアまたは1 * cpuコアの場合は100%確信していませんが、同時キューのスレッド数は限られています。

+0

ブロックされたスレッドがスレッドプールに返されないため、多くのスレッドがブロックされていると、スレッドがなくなる危険性がかなり高くなります。一般に、標準キューにはCPUコアあたり1つのスレッドしかありません。誰かがこれをサポートするためのドキュメントへの参照を持っていますか? – Twilite

+0

スレッドをブロックすることで、私はかなり確信しており、常にこれを避けるべきです。並列キューあたりのスレッド数は何とかCPUの数に制限されているということは、私が行ったことだけでした。しかし、これで私は絶対に確信していません。私はいくつかの参考文献を見つけることを試みる。 –

関連する問題