【问题标题】:Thread lifecycle in .NET framework.NET 框架中的线程生命周期
【发布时间】:2012-02-16 12:10:51
【问题描述】:

.NET 框架中线程的状态在this link 中进行了说明。

我最近在一个网站上看到了这张照片,我想到了几个问题:

  1. 操作系统中的线程生命周期与 .NET 框架中的线程生命周期不完全一致。有人可以提供与 .NET 框架的 OS 中的状态相匹配的资源吗?

  2. 我们在 .NET 框架中没有称为 Blocked 的状态。如果发出 I/O 请求,线程的状态是什么?

  3. Aborted 状态的目的是什么?当线程调用Abort() 方法时,会进入AbortRequested 状态,线程响应中止请求后,会进入Stopped 状态。那么Aborted状态的作用是什么?

【问题讨论】:

    标签: c# .net multithreading thread-state


    【解决方案1】:

    如果线程的执行被同步原语之一(例如锁或互斥锁)挂起,则线程将被阻塞。根据定义,在给定时刻执行有用工作的任何线程在该时刻都不会被阻塞。

    AbortRequested/Stopped 循环使线程有机会执行有序关闭、释放获取的资源并执行其他清理任务。

    http://www.albahari.com/threading/

    【讨论】:

    • 1.但是 .net 框架没有任何称为 Blocked 的状态。如果一个线程被操作系统阻塞(I / O请求或你提到的锁或互斥锁),它的状态是什么? 2. 是的,你是对的,但是每个操作系统都有一个预定义的线程生命周期。 Linux 有一个,Windows 也有一个。您可以查看一些教科书,例如 william Stallings 的“操作系统”。或者看看下面的链接:macdesign.net/academic/it4813/it4813-Submitted/…
    • 正确,.NET Framework 没有称为 Blocked 的状态,尽管有一些方法可以检查特定的 lockmutex 是否正在阻塞线程。
    • 我对Windows中线程的理解是,它们与.NET Framework中的线程本质上是一样的。要回答您的 (1),我们需要知道您以何种方式相信“操作系统中的线程生命周期与 .NET 框架中的线程生命周期不完全一致”
    • 例如,在 windows 中,我们有一个名为 Started 的状态,它在 .net 线程生命周期中不存在。或者窗口中的 Blocked 状态,我无法在 .net 中找到它的等效状态。除此之外,.net 还有一些在 Windows 状态中不存在的状态,例如 WaitSleepJoin。将这些状态与其在 OS 中的底层状态对齐有点棘手,我找不到合适的资源。
    • 我想你可能没有仔细阅读MSDN documentation。 WaitSleepJoin“阻塞”状态,Windows中的“Started”状态在.NET Framework中称为“Running”。
    【解决方案2】:

    回答您的问题:

    1. 我不相信这种映射会像您希望的那样有用。我从来没有遇到过,也从来不需要它。
    2. 除非您尝试编写诸如死锁检测器之类的东西(相当高级),否则并不真正需要“阻塞”状态。从典型的开发人员的角度来看,操作系统“阻塞”状态是暂时的,可以忽略。 (您的代码似乎正在运行,但操作系统在收到异步响应之前无事可做。)
    3. 将 Aborted 状态想象为 .NET 为线程中的所有代码提供异常处理程序。当捕获到异常,导致线程终止时,.NET 会为您将其转换为 Aborted 状态。否则,您可能无法区分异常和正常线程终止之间的区别。

    【讨论】:

    • 谢谢你。 1。我正在阅读诸如 Stallings 的“操作系统”之类的操作系统书籍,他提供了不同操作系统中线程状态的图表。我很想知道 .net 框架提供的内容与操作系统中真正实现的内容之间的关系是什么。你是对的,知道这个映射对于开发软件不是那么有用。 2.例如假设一个线程正在等待用户输入。实际上这个线程被操作系统阻塞,直到用户在控制台输入中输入某个东西,但线程的状态是运行?
    • 3。你能检查一下这个网站的线程状态部分吗? 'albahari.com/threading/part2.aspx#_ThreadState' 他在理论上是什么意思!
    • 请查看“线程状态”部分的图。从 AbortRequestedAborted 的转换。
    • @ManiAm:阅读本节albahari.com/threading/part4.aspx#_Aborting_Threads 应该会回答。基本上,他是说“中止”状态没有(或很少)设置。相反,当事情进展顺利时,它会变为“已停止”。
    猜你喜欢
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多