返回首页

void SomeMethod(int x, double y) {

  // some code

  ....

  new Thread(ThreadFunc).Start();

}


你想想上面的代码?
有人可能会说什么似乎是错误的。也许有人会说,没有足够的信息发表评论。一些可能会说,这是可怕的剥离一个这样的线程(最后一行的方法),并有一个垃圾收集在一个意想不到的执行线程的概率。这是一些有趣的讨论。
,然后提出我的想法和事实支持,简短的答案是NO。纺这样的一个线程不会被垃圾收集,我们预期,但应该在道德上是疯狂的编写这样的代码。好吧,让我们来讨论。
Thread类是像任何其他在BCL引用类型。当引用类型的一个实例认为没有更多更优秀的的引用,它是一个候选人被垃圾收集。更糟的是,它可以成为一个尽管它正在执行一个实例方法,而没有更多的优秀到该实例的引用。如果考虑这些事实,那么在自由意志在上面的代码创建的线程绑定,随时收集,同时执行相关的ThreadFunc。让我们尝试用简单的示例应用程序。{C}
在上面的示例应用程序中,我已经迫使垃圾收集,并等待待终结执行的两个重要点 - 1)在主线程2月底在线程委托执行的过程中)。我已确保有足够的机会气相色谱踢通过创建一些垃圾对象。这些都是一些重要的触发器用于GC一命呜呼
如果您运行的应用程序,你会看到应用程序不退出,直到循环运行完成;虽然主线程运行完成 - 打印quot;在结束quot;!。现在,让我们输入一个参数,该线程是前台线程和应用程序,不得退出,直到所有前台线程执行完毕。是,如果在上述代码中的线程是一个后台线程,应用程序将纷纷退出循环之前完成。但我们会创建了一个引用设置为一个后台线程,我们本来有停止的讨论,因为我们创建的线程\没有抱着一​​个参考开始。此外,问题的背景下,是不是应用程序退出,但应用程序运行。
好了,让我重新整理措辞的方式,是我们的环境有关​​的 - 如果您运行的应用程序,你会看到,线程函数运行成功完成(循环1000次,创建1000个对象,等待每个迭代为100ms循环,触发垃圾收集/待终结等待在执行过程中)。如果线程已被垃圾收集,它不会有运行1000次迭代成功。这是否意味着CLR有一个线程类型的软角落?似乎如此。
如果你向下钻取使用反射的螺纹类型,你会看到,它既不实现IDisposable也不是终结。一个对象怎么能不执行清理机制,逃脱万能的垃圾收集器,仍然不会造成任何破坏?这是奇怪!它给人的印象是,我们可能会泄漏的底层的本地线程资源。显然,CLR的乡亲,不小心,我们就不会运行托管代码编写的应用程序今天。我的常识告诉我,有幕后,这样每个线程的引用是莫名其妙地维护和清理,因此照顾打出了​​一些技巧。
所以我和Ananth卷起我们的袖子思考内运行时使用{A}的证据。这是很难项目的一些代码片段或从SSCLI向您展示quot;这里,这是evidencequot;不过,我可以分享我们所看到的。当创建一个线程,一个线程对象的引用添加到一个静态列表的框架保持。因此,建立一个参考用户代码是否持有与否。当一个线程开始时,有位执行的框架代码,然后轮流将权力移交给我们的线程委托。当我们的线程委托执行完毕(正常或异常),它返回给调用者内部的框架代码,这需要从静态列表中删除参考的照顾。框架代码,然后做一些清理工作,其中包括关闭线程句柄等。只有这样,一个线程对象成为垃圾收集的候选人,最后有什么具体的清理。我想在CLR的人足够聪明,(显然)这样做。因为1)线程是非常特殊的资源,其行为是有点比其他本地资源的不同2)螺纹类型是一个比原先的本地\ OS线程的只是包装。
我们看到的证据。现在,让我们讨论的士气。当你把代码与自由意志纺关闭线程一看,你不眨眼两次?不提出了很多问题的正确性,安全性等显然,这不是一个好的做法。仅仅因为是在框架照顾的东西,它不释放我们做这样的事。同意SSCLI不在,但依靠一些非常intrinstic详细的框架代码,它完全是为我们的应用程序代码的安全呢?我不这么认为。
像SomeMethod的代码的意图似乎火(关闭一个线程做一些处理)和忘记,因为它是在控股线程对象的引用不感兴趣。这是非常有可能,SomeMethod的可称为数或多次,我们将创建新线程只是为了消防和忘记。我们没有听说过,线程是昂贵的资源呢?为什么人们想出了线程池的想法?线程池等消防APT选择忘记或处理不需要线程关联。
下一次,您会看到这样的代码,如果你有权力去改变它,纠正它。如果没有,说是谁写的代码的开发。开始用柔和而温暖的的谈话,并解释了他的士气,或显示了他这个职位(一点点的营销!)。确保谈话不会成为积极的(让开发商防御)。即使在这种热烈的交谈,开发商没有开动脑筋,采取你的身边,他开枪!开个玩笑。
好了,这是我想分享的东西。现在轮到你了意见和/或更正。请分享您的想法,如果你发现或知道有关线程引用的任何其他证据和有关。我相信这将是一个有趣和值得讨论。

回答

评论会员:H 时间:2