我正在与队友讨论锁定.NET的问题。他是一个非常聪明的人,在低级和高级编程方面都有广泛的背景,但是他在低级编程方面的经验远远超过了我。无论如何,他认为应该在可能承受重负载的关键系统上避免.NET锁定,以免“僵尸线程”崩溃的可能性很小。我通常使用锁定,但我不知道“僵尸线程”是什么,所以我问。我从他的解释中得到的印象是,僵尸线程是已终止但仍保留了某些资源的线程。他举了一个关于僵尸线程如何破坏系统的示例,该示例是线程在锁定某个对象后开始执行某些过程,然后在可以释放锁之前终止。这种情况有可能使系统崩溃,因为最终尝试执行该方法将导致线程全部等待访问永远不会返回的对象,因为使用锁定对象的线程已死。
我想我明白了要点,但是如果我不在基地,请告诉我。这个概念对我来说很有意义。我并不完全相信这是.NET中可能发生的真实情况。我以前从未听说过“僵尸”,但我确实认识到在较低级别进行过深入研究的程序员往往对计算基础(例如线程)有更深的了解。我确实确实看到了锁定的价值,而且我看到许多世界一流的程序员都在利用锁定。我也没有能力自己评估这一点,因为我知道该lock(obj)
语句实际上仅是以下方面的语法糖:
bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }
并且因为Monitor.Enter
和Monitor.Exit
被标记extern
。可以想象.NET进行了某种处理,以保护线程免于暴露于可能造成这种影响的系统组件,但这纯粹是推测性的,并且可能基于我从未听说过“僵尸线程”的事实。之前。因此,我希望可以在这里获得一些反馈:
- 是否有比我在此解释的“僵尸线程”更清晰的定义?
- 僵尸线程可以出现在.NET上吗?(为什么/为什么不呢?)
- 如果适用,如何在.NET中强制创建僵尸线程?
- 如果适用,如何在不冒险使用.NET中僵尸线程的情况下利用锁定?
更新资料
两年多前,我问了这个问题。今天,这件事发生了:
wait
或来“释放”该子进程(及其资源)waitpid
。子进程则称为“僵尸进程”。另请参阅howtogeek.com/119815