我正在和一个队友讨论关于锁定。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做了某种处理来保护线程不暴露给可能产生这种影响的系统组件,但这纯粹是推测,可能只是基于我以前从未听说过“僵尸线程”这一事实。所以,我希望我能在这里得到一些反馈:
我在两年多以前问过这个问题。今天发生了这样的事: