2013-05-02 47 views
0

Grand Central Dispatch中的主線究竟是什麼?它是在程序啓動時創建的線程(可能在調用main()函數之前),它被任意稱爲「主線程」?或者它是程序的主執行流程,它始終爲每個正在運行的進程創建?我認爲第一種選擇是正確的,因爲不可能發送塊由程序的主執行流程執行,我想,除非這是明確完成的。因此,GCD中的主線程必須是創建用於等待塊執行的另一個線程。這樣對嗎?GCD的主線是什麼?

回答

1

GCD沒有主線程,除非在基於CF/Foundation的進程中運行,而該進程有自己的一個進程。如果您使用dispatch_main,則不存在主線程。

+0

所以你的意思是CoreFoundation是誰創建所謂的主線程和這個線程等事件,如塊調度事件?如果是的話,這個線程是一個CFRunLoop,它總是爲所有與CoreFoundation鏈接的程序隱式創建的? – LuisABOL 2013-05-03 00:33:29

+0

線程不是runloops。線程有runloops。然而,主隊列確實與主循環集成並由其驅動。在純libdispatch程序中,您不會使用主隊列。 – 2013-05-03 00:37:26

+0

對於我對線程和runloops所說的內容感到抱歉;我表達得很差。但是,無論如何,非常感謝! – LuisABOL 2013-05-03 00:43:08

1

OS X上的每個UI應用程序都有一個主線程 - 這是UI更新(並且必須)執行的地方。 GCD將一個隊列與該線程(主隊列)相關聯,並且也可以自由地在該線程上執行來自其他隊列的塊,但實際上,它通常會爲此目的創建其他線程,因爲通常認爲它不適合阻止主線程任何時間長度(這樣做都會引起可怕的SPOD,或者死亡,遊標的旋轉比薩餅)。

調用dispatch_main()也不會銷燬或消除對主線程的需求,它只是阻止它(這就是爲什麼UI應用程序應該使用運行循環代替)。

+0

謝謝,jkh。以及如何使主線程停止主流並執行一個塊?是通過向主線程發送一個信號(在程序啓動時用'sigaction'或其他方法設置了該信號的正確動作之後)? – LuisABOL 2013-05-03 16:12:35

+0

沒有涉及的信號 - GCD只是知道哪些塊在它正在管理的所有隊列上被入隊,並且假定運行循環行爲允許它,則在最合適的線程上執行每個塊。這就是爲什麼主線程通常與主隊列最直接相關的原因;那麼對程序員來說至少是明確的,阻塞主線太久會帶來SPOD。 – jkh 2013-05-03 19:55:50