質問

誰でも簡単に行き詰まりのサンプルコードc#?とお伝えください最も簡単な方法を見つの行き詰まり、あるいはC#のコードサンプルです。ることができるツールを検出する死ロック指定されたサンプルコードです。)

注意:していまVS2008年

正しい解決策はありません

他のヒント

あなたが同じ順序で取得されていないロックを入れ子にしている場合は、

1つの一般的な方法です。 1がロックAを取得し、2がロックBを取得することができ、それらがデッドロックになるスレッドができたスレッド

var a = new object();
var b = new object();

lock(a) {
   lock(b) {

   }
}

// other thread
lock (b) { 
  lock(a) {

  }
}

編集:非ロック例.. waithandlesを使用。ソクラテスとデカルトはステーキを有しており、それらの両方が、礼儀哲学である、フォークと食べるためにナイフの両方を必要とすると仮定する。それぞれの道具をつかみ、その後、その器具に手に他のために永遠に待機することは可能であるので、しかし、彼らは、銀の唯一のセットがあります。

ダイニング賢者の問題

を参照してください。
WaitHandle fork = new AutoResetEvent(), knife = new AutoResetEvent();

while(Socrates.IsHungry) {
   fork.WaitOne();
   knife.WaitOne();
   Eat();
   fork.Set();
   knife.Set();
} 

// other thread
while(Descartes.IsHungry) {
   knife.WaitOne();
   fork.WaitOne();
   Eat();
   knife.Set();
   fork.Set();
} 

これは、C#コードでデッドロックを作成するための典型的なコードです。 http://msdn.microsoft.com/en-us/:このMSDNの記事をチェックアウト雑誌/ cc188793.aspxする

using System;

using System.Threading;


public class Simple {

    static object A = new object();

    static object B = new object();


    static void MethodA()
    {
        Console.WriteLine("Inside methodA");
        lock (A)
        {
            Console.WriteLine("MethodA: Inside LockA and Trying to enter LockB");
            Thread.Sleep(5000);           
            lock (B)
            {
                Console.WriteLine("MethodA: inside LockA and inside LockB");
                Thread.Sleep(5000);
            }
            Console.WriteLine("MethodA: inside LockA and outside LockB");
        }
        Console.WriteLine("MethodA: outside LockA and outside LockB");
    }

    static void MethodB()
    {
        Console.WriteLine("Inside methodB");
        lock (B)
        {
            Console.WriteLine("methodB: Inside LockB");
            Thread.Sleep(5000);
            lock (A)
            {
                Console.WriteLine("methodB: inside LockB and inside LockA");
                Thread.Sleep(5000);
            }
            Console.WriteLine("methodB: inside LockB and outside LockA");
        }
        Console.WriteLine("methodB: outside LockB and outside LockA");
    }

    public static void Main(String[] args)
    {

        Thread Thread1 = new Thread(MethodA);
        Thread Thread2 = new Thread(MethodB);
        Thread1.Start();
        Thread2.Start();
        Console.WriteLine("enter.....");
        Console.ReadLine();

    }
}

の行き詰まりサンプルコードを使用しよう lock(this) クラスのシミュレーションを行き詰ます。精算 この例では、.

以下の二つの値の読みの記事を検知し、行き詰まりを実行時に討議方法を回避してまいります。

  1. 行き詰まり監視 によるスティーブンToub.
  2. TimedLock再 によりイアン-Griffiths.

C#でのデッドロックを達成するためのもう一つの方法があります。プール内のスレッドの.NET 2.0 SP1の数は、コアごとに(以前のバージョンで25から)250に限定されるからです。

だから、techically、あなたがプールにあまりにも多くのタスクを開始することができる別の非同期操作の完了待ち(つまり、スレッドプールを介して実行されます)。そのため、プール内のタスクが解放されることはありませんし、使用可能なスレッドが存在しないため、非同期タスクが開始されません。

あなたはここで例とより正確な説明を見つけることができます。 。デッドロックする

デッドロック検出についてのご質問の一部に答えるために、私はむしろこれが可能一般的であることを疑います。これは、停止問題と問題の似ている、あなたが効果的にセマンティクスを計算することはできません。これを克服する1つの方法は、定期的に2つのスレッドが応答しない場合、あなたは彼らがビジー状態にされているか、彼らはデッドいると仮定することができ、それはまだ生きている場合は、各スレッドをポーリングし、答えにそれを一定のタイムアウトを与えるだろう、ウォッチドッグを使用することですロックされています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top