假设我有一段代码如下:
int Main()
{
if (true)
{
new Thread(()=>
{
doSomeLengthyOperation();
}).Start();
}
while (true)
{
//do nothing
}
}
有 2 个线程,我将把正在执行 Main() 函数的线程称为主线程,并将在“if”测试中新建的线程称为线程 A。
我的问题是,线程A什么时候被销毁? doSomeLenghtyOperation() 能够完成吗?
由于没有指向线程 A 的引用,因此它是否会被标记为垃圾回收的候选者:
- 在“new Thread().Start()”语句本身完成之后?
- 退出“if(true)”范围后立即?
- doSomeLengthOperation() 运行完成后?
- Never?
我看到的所有示例都是 Main() 持有引用,然后主线程在退出之前等待与线程 A 加入。我很好奇上面代码的生命周期是多少。
提前致谢!
“线程”一词在这里可能有多种含义:
- System.Threading.Thread 对象(由
new Thread()
),
- CLR线程(托管线程),
- 操作系统线程(非托管线程)。
Start() 方法完成后,线程对象将成为 GC 的候选对象,因为不再有对其的引用。
当 doSomeLengthyOperation() 运行时,托管线程将保持活动状态。
引用article http://msdn.microsoft.com/en-us/magazine/cc163491.aspx#S3作者:James Kovacs,微软 MVP:
托管线程的生命周期是
独立于 Thread 对象
创造了它,这是一件非常好的事情
你不希望 GC 这样做
终止仍在运行的线程
工作只是因为你失去了一切
对关联线程的引用
目的。所以GC正在收集
线程对象,但不是实际的
托管线程。
如果您想亲自尝试,本文还包含一些有用的代码示例。
理论上,操作系统线程与托管线程没有一对一的关系。从MSDN http://msdn.microsoft.com/en-us/library/system.threading.thread%28v=VS.90%29.aspx:
...复杂的主机可以使用 CLR Hosting API 针对同一操作系统线程调度许多托管线程,或者在不同操作系统线程之间移动托管线程。
但实际上,CLR 线程今天直接映射到 Windows 线程 http://my.safaribooksonline.com/9780735640467/clr_threads_and_windows_threads.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)