.NET框架中的线程生命周期

17

在.NET框架中,线程的状态可参见该链接

我最近在一个网站上看到了这张图片并想到了一些问题:

enter image description here

  1. 操作系统中的线程生命周期与.NET框架中的线程生命周期不完全一致。有没有资源可以将操作系统中的状态与.NET框架中的状态匹配起来?

  2. .NET框架中没有名为“Blocked”的状态。如果线程发出I/O请求,那么它的状态是什么?

  3. “Aborted”状态的目的是什么?当线程调用“Abort()”方法时,它将进入“AbortRequested”状态,等待响应中止请求后,它将进入“Stopped”状态。所以,“Aborted”状态的作用是什么?

2个回答

6
一个线程被阻塞,如果其执行被同步原语(如锁或互斥量)之一暂停。任何正在执行有用工作的线程,在某个时刻定义上,此时不会被阻塞。
“AbortRequested/Stopped”循环为线程提供了执行有序关闭、释放已获取资源和执行其他清理任务的机会。 http://www.albahari.com/threading/

我对Windows中的线程的理解是它们本质上与.NET Framework中的线程相同。为了回答你的第一个问题,我们需要知道你认为“操作系统中的线程生命周期与.NET Framework中的线程生命周期不完全一致”是以何种方式表现出来的。 - Robert Harvey
1
我认为你可能没有仔细阅读MSDN文档。WaitSleepJoin “阻塞”状态,在Windows中的“已启动”状态在.NET Framework中被称为“运行”。 - Robert Harvey
如果它们是相同的,为什么在上图中为每个设计了两种不同的状态呢?我们都有“已阻止”和“等待/睡眠/加入”。 “开始”与“运行”是不同的,它们具有不同的含义。 - ManiAm
Blocked == WaitSleepJoin。两个不同的名称,表示同一件事情。 - Robert Harvey
@MartinJames:我删除了我回答中的那部分。 - Robert Harvey
显示剩余5条评论

3

以下是你的问题的答案:

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

  1. 我正在阅读像 Stallings 的“操作系统”这样的操作系统书籍,他为不同操作系统中的线程状态提供了一张图。我很好奇 .NET Framework 提供的是什么,以及实现在操作系统中是什么。你说得对,知道这种映射对软件开发不是很有用。
  2. 例如,假设一个线程正在等待用户输入。实际上,该线程被操作系统阻塞,直到用户在控制台输入内容,但该线程的状态是运行中吗?
- ManiAm
  1. 请问您能否查看此网站的线程状态部分。 'http://www.albahari.com/threading/part2.aspx#_ThreadState' 他在“仅理论上!”中的意思是什么?
- ManiAm
请查看“线程状态”部分中的图表。从AbortRequestedAborted的转换。 - ManiAm
@ManiAm:阅读这个部分http://www.albahari.com/threading/part4.aspx#_Aborting_Threads应该能解答你的问题。基本上,他是说“已中止”状态不会(或很少)被设置。相反,当一切顺利时,它会转移到“已停止”状态。 - John Fisher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接