C#Thread对象的生命周期

jon*_*_ou 18 c# multithreading object-lifetime

假设我有如下代码:

int Main()
{
    if (true)
    {
       new Thread(()=>
          {
              doSomeLengthyOperation();
          }).Start();
    }
    while (true)
    {
       //do nothing
    }
}
Run Code Online (Sandbox Code Playgroud)

有2个线程,我会打电话给主线程正在执行main()函数的线程,该线程被new'ed了里面的"如果"测试为主题A.

我的问题是,线程A什么时候被销毁?do doSomeLenghtyOperation()能够完成吗?

由于没有指向线程A的引用,它是否会被标记为垃圾收集的候选者:

  1. 紧接着"new Thread().Start()"语句本身完成了吗?
  2. 退出"if(true)"范围后立即?
  3. doSomeLengthOperation()运行完成后?
  4. 决不?

我看到的所有示例都是Main()持有引用,然后主线程在退出之前等待与线程A连接.我很好奇上面代码的生命周期是什么.

提前致谢!

Guf*_*ffa 14

Thread只要不再使用该对象,即在调用该Start方法后立即进行垃圾收集,该对象将有资格进行垃圾收集.(但是不会立即收集,因为垃圾收集器会在特定时间运行.)

然而,实际线程不依赖于Thread对象,并且即使Thread收集对象也将继续运行.

如果在main方法退出时线程仍在运行,则应用程序将不会在线程完成之前结束,除非您已将该线程标记为后台线程.

  • 我对此仍然不满意.如果线程对象是GCed,那么如果我们在LongRunning任务中使用线程对象本身的属性会发生什么?例如,使用Thread.CurrentThread.Name.我认为Thread.CurrentThread很可能将它保存在内存中. (3认同)
  • "Thread对象将尽快进行垃圾收集".这不是真的.GC不具有确定性.你必须说"它将成为垃圾收集的候选人".除非达到某个阈值,否则GC不会启动. (2认同)
  • 我很确定这个答案是错误的:线程A不符合*的条件,因为在它自己执行的上下文中仍然有引用它的'Thread.Current` - 并且可能还有其他引用.线程运行时,线程对象无法进行GC.这里还有一个额外的问题:它确实取决于究竟是什么被认为是GC根,特别是如何计算`Thread.Current` - 就像在,我假设`Thread.Current`"存储了一个强大的参考某种程度上,而不是某种弱-ref缓存. (2认同)

Vla*_*adV 13

单词"thread"在这里可能意味着几件事:

  • System.Threading.Thread对象(由...创建new Thread()),
  • CLR线程(托管线程),
  • OS线程(非托管线程).

一旦Start()方法完成,线程对象将成为GC的候选对象,因为没有更多对它的引用.

当doSomeLengthyOperation()运行时,托管线程将保持活动状态.

引用微软MVP的James Kovacs 撰写的文章:

托管线程的生命周期独立于创建它的Thread对象,这是一件非常好的事情,因为您不希望GC仅仅因为丢失了对关联Thread对象的所有引用而终止仍在工作的线程.所以GC正在收集Thread对象,而不是实际的托管线程.

如果您想自己试验,本文还包含一些有用的代码示例.

理论上,操作系统线程与托管线程没有一对一的关系.来自MSDN:

...复杂的主机可以使用CLR Hosting API针对同一操作系统线程调度许多托管线程,或者在不同操作系统线程之间移动托管线程.

但实际上,CLR 线程今天直接映射到Windows线程.


Dar*_*rov 10

线程A什么时候被破坏?

doSomeLengthyOperation完成.

将doSomeLenghtyOperation()能够运行完成

是的,即使主线程存在,因为它不是后台线程.如果在主线程存在时将IsBackground属性设置为true在启动线程之前,则该线程也将停止.

  • 从MSDN文档:"一旦启动线程,就没有必要保留对Thread对象的引用.线程继续执行,直到线程过程完成." "后台线程与前台线程相同,除了后台线程不会阻止进程终止.一旦属于某个进程的所有前台线程都已终止,公共语言运行库就会结束该进程.任何剩余的后台线程都会停止并且不会完成". (4认同)