我知道隊列不是線程。隊列是比GCD中的線程更高層次的概念。程序員只處理隊列,讓系統決定執行哪些線程塊以獲得最大效率。iOS GCD:主線程從主隊列以外的隊列中取出隊列?
我知道主隊列綁定到主線程,這意味着如果我在主隊列上放置一個塊,只有主線程將出隊並運行它。我的問題是:是否有可能主隊列從隊列(串行或併發)中取出隊列而不是主隊列?
我知道隊列不是線程。隊列是比GCD中的線程更高層次的概念。程序員只處理隊列,讓系統決定執行哪些線程塊以獲得最大效率。iOS GCD:主線程從主隊列以外的隊列中取出隊列?
我知道主隊列綁定到主線程,這意味着如果我在主隊列上放置一個塊,只有主線程將出隊並運行它。我的問題是:是否有可能主隊列從隊列(串行或併發)中取出隊列而不是主隊列?
如果您使用dispatch_sync
,這是可能的。 The documentation for dispatch_sync
這樣說:
作爲一種優化,這個函數在可能的時候調用當前線程上的塊。
因此,如果您在主線程上使用dispatch_sync
,它可能會在主線程上執行該塊。
問題:「主線程是否有可能從隊列(串行或併發)中取出塊而不是主隊列?」
答案:「不」。
如果GCD允許提交給全局併發隊列的塊在主線程上運行,那麼這些塊也可能執行長時間運行的操作,從而阻塞了用戶界面,這既不好也不利於GCD自己的設計原則。這也不是它如何被記錄下來的工作(如果你想知道確切地說是 GCD如何工作,源代碼總是一個很好的參考,因爲GCD也是開源的)。當前線程可能在當前線程上執行塊的唯一時間是在dispatch_sync()情況下進行優化,因爲很明顯程序員不打算在該塊之前返回當前線程,並且它之前的任何入隊塊,無論如何,阻止當前的線程是預期的行爲,所以沒有什麼驚喜。 dispatch_async()顯然不是這樣,因爲該API顯然需要異步行爲。最後,爲了清除該答案中的另一個混淆點,dispatch_queue_create()不僅創建串行隊列 - 它也可以用於創建併發隊列,因此併發隊列的執行並不是全局唯一的全局性併發隊列!請參閱第二個參數 - 它可以設置爲DISPATCH_QUEUE_CONCURRENT
來創建併發隊列(手冊頁有點過時,但/usr/include/dispatch/queue.h
中的HeaderDoc是權威的)。
'dispatch_async'怎麼樣?我找不到任何文件。 – Philip007
我不認爲主線程從其他隊列中取出塊,但不能保證它。 –
從根本上說,'dispatch_async'在主線程上運行是沒有意義的,因爲它不再是異步的。主線程在執行該塊時將無響應。 – borrrden