“通过调用Start,Unstarted线程转换为Running状态。” [来自msdn ThreadState enumeration docs。
线程何时从Unstarted转换为Running?
如果我实例化一个线程并调用Start,那么在线程实际转移到Running之前是否存在延迟?如果实例化线程在Start之后立即调用Join,那么它是否存在一个风险,它会在Unstarted状态下捕获新线程?
答案 0 :(得分:1)
对Start
的调用不是异步的,因此该方法将在线程启动时返回。我在一些示例应用程序中完成了此操作,之后立即调用Join
从未导致任何问题。
答案 1 :(得分:1)
ThreadState.Unstarted的文档说明
Unstarted The Thread::Start method has not been invoked on the thread.
换句话说,不,在调用Thread :: Start之后,你不能以Thread.Unstarted结束。但不保证线程在ThreadState.Running中,如果它在检查状态之前在Mutex上阻塞,它可能在例如ThreadState.WaitSleepJoin中。
导致Join问题的唯一ThreadState是ThreadState.Unstarted,所以在Start之后调用Join是安全的,前提是Start不会抛出异常。
答案 2 :(得分:1)
在Running
方法返回之前,它的状态变为Start()
,尽管它可能还没有(通常也不会)完成任何实际工作,因为它可能还没有给出任何核心时间。大多数情况下,我们可以认为胎面运行是足够的(正如大多数时候我们可以认为“我们有6个线程运行”,如果我们只有4个核心,显然我们只能达到4实际做某事)。也可能是当你到达调用线程的下一条指令时,它是WaitSleepJoin
甚至Stopped
但它不会是Unstarted
。
即使在Join()
之后的下一个语句中调用Start()
也是完全安全的(尽管这很少有用)。