2013-05-02 46 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