“通过调用启动,将未启动的线程转换为运行状态。” [来自msdn ThreadState enumeration docs。从未启动到正在运行的线程的时序
究竟何时线程从Unstarted转换到运行?
如果我实例化一个线程并调用Start,线程实际上移动到Running之前是否有延迟?如果实例化线程在启动之后立即调用Join,那么是否有风险会在未启动状态下捕获新线程?
“通过调用启动,将未启动的线程转换为运行状态。” [来自msdn ThreadState enumeration docs。从未启动到正在运行的线程的时序
究竟何时线程从Unstarted转换到运行?
如果我实例化一个线程并调用Start,线程实际上移动到Running之前是否有延迟?如果实例化线程在启动之后立即调用Join,那么是否有风险会在未启动状态下捕获新线程?
其状态变为Running
的Start()
方法返回之前,尽管它可能还没有(而且经常不会)做了任何实际的工作,因为它可能还没有得到任何核心时间。大多数情况下,我们可以认为跑步已经足够了(就像大多数时候我们可以认为“我们有6个线程在运行”一样,如果我们只有4个内核,显然我们只需要4实际上在做某事)。也可能是,当你到达调用线程的下一条指令时,它是WaitSleepJoin
甚至Stopped
,但它不会是Unstarted
。
即使在Start()
(尽管这很少有用)之后的下一个声明中,呼叫Join()
也是非常安全的。
对Start
的调用不是异步的,所以该方法将在线程启动时返回。我已经在几个示例应用程序中完成了这项工作,然后立即致电Join
从未造成任何问题。
为ThreadState.Unstarted文档状态
Unstarted The Thread::Start method has not been invoked on the thread.
换句话说,不,你不能Thread.Unstarted主题后最终::开始被调用。 Thread不能保证在ThreadState.Running中,但它可以在例如ThreadState.WaitSleepJoin中,如果它在检查状态之前阻塞了互斥锁。
虽然导致加入问题的唯一ThreadState是ThreadState.Unstarted,但是在Start之后调用Join是安全的,只要Start不会引发异常。
我相信你的问题的第一行会为你解答。 – 2012-01-27 10:58:55
据说它通过调用Start来进行转换,它并没有说它在Start返回之前发生了...... – 2012-01-27 11:05:49