7
ゾンビは.NETに存在しますか?
.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でゾンビスレッドのシナリオを危険にさらすことなくロックを活用するにはどうすればよいですか? 更新 私は2年以上前にこの質問をしました。今日これが起こりました: