2012-10-12 116 views
1

我知道隊列不是線程。隊列是比GCD中的線程更高層次的概念。程序員只處理隊列,讓系統決定執行哪些線程塊以獲得最大效率。iOS GCD:主線程從主隊列以外的隊列中取出隊列?

我知道主隊列綁定到主線程,這意味着如果我在主隊列上放置一個塊,只有主線程將出隊並運行它。我的問題是:是否有可能主隊列從隊列(串行或併發)中取出隊列而不是主隊列?

回答

1

如果您使用dispatch_sync,這是可能的。 The documentation for dispatch_sync這樣說:

作爲一種優化,這個函數在可能的時候調用當前線程上的塊。

因此,如果您在主線程上使用dispatch_sync,它可能會在主線程上執行該塊。

+0

'dispatch_async'怎麼樣?我找不到任何文件。 – Philip007

+0

我不認爲主線程從其他隊列中取出塊,但不能保證它。 –

+0

從根本上說,'dispatch_async'在主線程上運行是沒有意義的,因爲它不再是異步的。主線程在執行該塊時將無響應。 – borrrden

3

問題:「主線程是否有可能從隊列(串行或併發)中取出塊而不是主隊列?」

答案:「不」。

如果GCD允許提交給全局併發隊列的塊在主線程上運行,那麼這些塊也可能執行長時間運行的操作,從而阻塞了用戶界面,這既不好也不利於GCD自己的設計原則。這也不是它如何被記錄下來的工作(如果你想知道確切地說是 GCD如何工作,源代碼總是一個很好的參考,因爲GCD也是開源的)。當前線程可能在當前線程上執行塊的唯一時間是在dispatch_sync()情況下進行優化,因爲很明顯程序員不打算在該塊之前返回當前線程,並且它之前的任何入隊塊,無論如何,阻止當前的線程是預期的行爲,所以沒有什麼驚喜。 dispatch_async()顯然不是這樣,因爲該API顯然需要異步行爲。最後,爲了清除該答案中的另一個混淆點,dispatch_queue_create()不僅創建串行隊列 - 它也可以用於創建併發隊列,因此併發隊列的執行並不是全局唯一的全局性併發隊列!請參閱第二個參數 - 它可以設置爲DISPATCH_QUEUE_CONCURRENT來創建併發隊列(手冊頁有點過時,但/usr/include/dispatch/queue.h中的HeaderDoc是權威的)。

+0

我覺得'dispatch_queue_create()'只能創建串行隊列。您可以根據需要創建儘可能多的串行隊列。但是,只有三個併發隊列,都是由系統創建的。你永遠不會創建併發隊列,只需使用給定的三個 – Philip007

+1

不是真的!請參閱/ usr/include/dispatch/queue。h和dispatch_queue_create的HeaderDoc。您傳遞DISPATCH_QUEUE_CONCURRENT作爲第二個參數來創建併發隊列。我已經編輯了上面的答案以使其更清楚。 – jkh