我知道GCD只會根據需要創建儘可能多的線程來充分利用CPU。在使用dispatch_async
啓動約30個後臺任務的代碼中,我看到活動監視器中的線程數量跳過了大約30個。我不會期望的,因爲它只是一個雙核心PC。Grand Central Dispatch應該創建多少個線程?
我確定我誤解了一些東西。有人能告訴我發生了什麼事嗎?
我知道GCD只會根據需要創建儘可能多的線程來充分利用CPU。在使用dispatch_async
啓動約30個後臺任務的代碼中,我看到活動監視器中的線程數量跳過了大約30個。我不會期望的,因爲它只是一個雙核心PC。Grand Central Dispatch應該創建多少個線程?
我確定我誤解了一些東西。有人能告訴我發生了什麼事嗎?
GCD通過添加更多線程來增加線程池的一種情況是I/O爭用。如果調度塊等待文件系統或網絡I/O,則它不使用CPU,因此GCD認爲CPU處於空閒狀態並且能夠處理更多線程。
實際上,根據調度塊的性質,這可能會進一步增加I/O爭用並達到512個工作線程的限制。關於這種情況,Mike Ash寫了一個blog post。
啊,有趣。這些線程正在調用`AXUIElememt ...`函數來檢查其他應用程序,這似乎需要應用程序的合作(儘管我從來沒有完全瞭解它的工作原理)。這可能是阻塞原因的後面。 – 2011-01-27 21:43:47
你的調度塊,呃,塊?也就是說,他們做文件系統/網絡I/O嗎? – 2011-01-27 21:25:58