2012-01-27 100 views
2

“通过调用启动,将未启动的线程转换为运行状态。” [来自msdn ThreadState enumeration docs从未启动到正在运行的线程的时序

究竟何时线程从Unstarted转换到运行?

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

+0

我相信你的问题的第一行会为你解答。 – 2012-01-27 10:58:55

+0

据说它通过调用Start来进行转换,它并没有说它在Start返回之前发生了...... – 2012-01-27 11:05:49

回答

1
  1. 其状态变为RunningStart()方法返回之前,尽管它可能还没有(而且经常不会)做了任何实际的工作,因为它可能还没有得到任何核心时间。大多数情况下,我们可以认为跑步已经足够了(就像大多数时候我们可以认为“我们有6个线程在运行”一样,如果我们只有4个内核,显然我们只需要4实际上在做某事)。也可能是,当你到达调用线程的下一条指令时,它是WaitSleepJoin甚至Stopped,但它不会是Unstarted

  2. 即使在Start()(尽管这很少有用)之后的下一个声明中,呼叫Join()也是非常安全的。

1

Start的调用不是异步的,所以该方法将在线程启动时返回。我已经在几个示例应用程序中完成了这项工作,然后立即致电Join从未造成任何问题。

1

为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不会引发异常。

相关问题