web-dev-qa-db-ja.com

C#でのスレッドデッドロックの例

誰かがC#言語でスレッドデッドロックがどのように発生する可能性があるかの例を挙げられますか?

25
CodingThunder
static object object1 = new object();
static object object2 = new object();

public static void ObliviousFunction()
{
    lock (object1)
    {
        Thread.Sleep(1000); // Wait for the blind to lead
        lock (object2)
        {
        }
    }
}

public static void BlindFunction()
{
    lock (object2)
    {
        Thread.Sleep(1000); // Wait for oblivion
        lock (object1)
        {
        }
    }
}

static void Main()
{
    Thread thread1 = new Thread((ThreadStart)ObliviousFunction);
    Thread thread2 = new Thread((ThreadStart)BlindFunction);

    thread1.Start();
    thread2.Start();

    while (true)
    {
        // Stare at the two threads in deadlock.
    }
}
41
Tanzelax

From C#でのスレッド化

スケールの反対側では、個別の同期コンテキストがデッドロックを引き起こします。次に例を示します。

[Synchronization]
public class Deadlock : ContextBoundObject {
    public DeadLock Other;
    public void Demo() { Thread.Sleep (1000); Other.Hello(); }
    void Hello() { Console.WriteLine ("hello"); }
}
public class Test {
    static void Main() {
    Deadlock dead1 = new Deadlock();
    Deadlock dead2 = new Deadlock();
    dead1.Other = dead2;
    dead2.Other = dead1;
    new Thread (dead1.Demo).Start();
    dead2.Demo();
}

Deadlockの各インスタンスはTest内で作成されるため(非同期クラス)、各インスタンスは独自の同期コンテキストを取得し、したがって独自のロックを取得します。 2つのオブジェクトが相互に呼び出しを行う場合、デッドロックが発生するのにそれほど時間はかかりません(正確には、1秒です!)デッドロッククラスとテストクラスが異なるプログラミングチームによって作成された場合、問題は特に潜行します。テストクラスの責任者が違反を認識していることを期待するのは不合理かもしれません。ましてや、それを解決する方法を知っていることは言うまでもありません。これは、デッドロックが通常より明白である明示的なロックとは対照的です。

6
James Kolpack