线程从“未启动”过渡到“正在运行”的时间

本文关键字:运行 正在运行 时间 过渡到 启动 未启动 线程 | 更新日期: 2023-09-27 18:21:39

"一个未启动的线程通过调用Start转换到运行状态。"[来自msdn ThreadState枚举文档.

线程究竟什么时候从"未启动"转换为"正在运行"?

如果我实例化一个线程并调用Start,那么在线程真正移动到Running之前是否有延迟?如果实例化线程在Start之后立即调用Join,是否存在捕获处于Unstarted状态的新线程的风险?

线程从“未启动”过渡到“正在运行”的时间

  1. Start()方法返回之前,它的状态变为Running,尽管它可能还没有(而且通常不会)完成任何实际工作,因为它可能还未得到任何核心时间。大多数时候,我们可以认为胎面在运行就足够了(就像大多数时候我们可以认为"我们有6个线程在运行"一样,如果我们只有4个核心,那么显然我们实际上只有4个)。也可能是当你到达调用线程上的下一条指令时,它是WaitSleepJoin,甚至是Stopped,但不会是Unstarted

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

Start的调用不是异步的,因此该方法将在线程启动时返回。我已经在一些示例应用程序中做到了这一点,之后立即调用Join从未引起任何问题。

ThreadState.Unstarted states 的文档

Unstarted   The Thread::Start method has not been invoked on the thread.

换句话说,不,你不能以Thread结束。在Thread::Start被调用后,你会感到沮丧。线程不能保证处于ThreadState。不过,在运行时,如果在检查状态之前它阻塞了Mutex,它可能处于ThreadState.WaitSleepJoin。

唯一导致Join出现问题的ThreadState是ThreadState。不过,如果Start没有抛出异常,那么在Start之后调用Join是安全的。