2

當選擇運行dispatch_async的隊列時,會提及很多dispatch_get_global_queue。這是一個將任務委託給特定線程的特殊背景隊列嗎?它幾乎是單身?如果我想讓任務在後臺運行,「dispatch_get_global_queue」隊列如何工作?

因此,如果我總是使用該隊列來調用dispatch_async調用,那麼該隊列是否已滿並且必須等待事情完成才能啓動另一個隊列,還是可以將其他任務分配給不同的線程?

我猜我有點困惑,因爲當我選擇了隊列的NSOperation,我可以選擇的隊列主線程與[NSOperationQueue mainQueue],這似乎同義dispatch_get_main_queue但我下的印象背景隊列NSOperation必須單獨製作NSOperationQueue的實例,但GCD對於後臺隊列有單例嗎? (dispatch_get_global_queue

而且 - 愚蠢的問題,但希望確保 - 如果我把一個任務隊列,隊列被分配到一個線程,對不對?如果任務足夠大,它不會將其分割到多個線程中,是嗎?

+2

«[dispatch_get_global_queue']是一個將任務委託給某個線程的特殊背景隊列嗎?»這真的很清楚地被函數文檔回答了。你讀過嗎?如果是這樣,請更具體地說明你不瞭解的內容。如果沒有,請閱讀。 –

回答

4

當選擇運行dispatch_async的隊列時, dispatch_get_global_queue被提及很多。這是一個特殊的 背景隊列,將任務委託給某個線程嗎?

某個線程?第dispatch_get_global_queue爲您檢索所請求的相對優先級的全局隊列。由dispatch_get_global_queue返回的所有隊列是併發的,並且可以根據系統的判斷向多個不同的線程分派工作。這個機制是一個實現細節,作爲API的消費者對你來說是不透明的。

在實踐中,並且存在過分簡化它的風險,每個優先級級別都有一個全局隊列,在撰寫本文時,根據我的經驗,每個人都會在任何時候調度工作介於0到64個線程之間。

它幾乎是單身?

嚴格不,但你可以把它們想象成單身人士,每個優先等級有一個單身人士。

所以,如果我使用的隊列總是爲我dispatch_async電話,將是 隊列得到充分而不得不等待事情完成之前,另一個 一個可以啓動,或者可以將其分配其他任務不同的線程?

它可以變滿。實際上,如果你正在飽和一個全球併發隊列(即同時在同一時間有超過64個相同優先級的後臺任務),那麼你的設計可能會很糟糕。(見this answer更多細節上的隊列寬度限制)

我猜我有點困惑,因爲當我選擇了 一個的NSOperation隊列中,我可以 選擇主線程隊列[ NSOperationQueue mainQueue],這似乎同義 dispatch_get_main_queue

他們沒有嚴格的代名詞。儘管NSOperationQueue使用GCD,但還是有一些重要的區別。例如,在主運行循環的一次通過中,只有一個排入+[NSOperationQueue mainQueue]的操作將被執行,而提交給dispatch_get_main_queue的多個塊可能會在單次運行循環中執行。這可能對你無關緊要,但嚴格來說,它們不是同一件事。

,但我的印象是背景 隊列的NSOperation必須單獨製作 NSOperationQueue的情況下,但GCD有一個背景隊列單身? (dispatch_get_global_queue)

總之,是的。這聽起來像你在混合GCD和NSOperationQueue。 GCD不僅僅是一個「簡單的包裝物」,它是它自己的東西。它在GCD之上實施的事實對你來說應該不重要。 NSOperationQueue是一個任務隊列,具有明確可設置的寬度,您可以創建「隨意」實例。只要你喜歡,你可以製作儘可能多的。在某些時候,NSOperationQueue的所有實例在執行NSOperations時,都會從系統資源池中提取資源,與其他進程一樣(包括GCD),所以是的,這裏有一些交互,但它們對您而言是不透明的。

此外 - 愚蠢的問題,但要確保 - 如果我把一個任務 在隊列中,隊列被分配給一個線程,對吧?如果任務是 足夠大,它不會將其分割到多個線程上,是嗎?

單個任務只能在單個線程上執行。系統不得不將一個單一的任務「拆分」爲子任務。這是你的工作。關於你的具體用法,隊列沒有「分配給一個線程」,任務是。隊列中要執行的下一個任務可能會在完全不同的線程上執行。