线程从Unstarted转换到Running的时间

时间:2012-01-27 10:49:54

标签: c# multithreading

“通过调用Start,Unstarted线程转换为Running状态。” [来自msdn ThreadState enumeration docs

线程何时从Unstarted转换为Running?

如果我实例化一个线程并调用Start,那么在线程实际转移到Running之前是否存在延迟?如果实例化线程在Start之后立即调用Join,那么它是否存在一个风险,它会在Unstarted状态下捕获新线程?

3 个答案:

答案 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)

  1. Running方法返回之前,它的状态变为Start(),尽管它可能还没有(通常也不会)完成任何实际工作,因为它可能还没有给出任何核心时间。大多数情况下,我们可以认为胎面运行是足够的(正如大多数时候我们可以认为“我们有6个线程运行”,如果我们只有4个核心,显然我们只能达到4实际做某事)。也可能是当你到达调用线程的下一条指令时,它是WaitSleepJoin甚至Stopped但它不会是Unstarted

    < / LI>
  2. 即使在Join()之后的下一个语句中调用Start()也是完全安全的(尽管这很少有用)。