「デッドロック」の他の解釈があるかもしれませんが、AFAIK:
デッドロックは、2 つのスレッドがそれぞれ別のスレッドによって保持されているリソースを待機しているときに発生し、どちらも処理を進めることができません。
しかし、私はSOでここでいくつかの答えを見てきました.
namespace ConsoleApplication7
{
public class Program
{
public static void Main(string[] args)
{
LockableClass lockable = new LockableClass();
new Thread(new ParameterizedThreadStart(BackgroundMethod)).Start(lockable);
Thread.Sleep(500);
Console.Out.WriteLine("calling Reset");
lockable.Reset();
}
private static void BackgroundMethod(Object lockable)
{
lock (lockable)
{
Console.Out.WriteLine("background thread got lock now");
Thread.Sleep(Timeout.Infinite);
}
}
}
public class LockableClass
{
public Int32 Value1 { get; set; }
public Int32 Value2 { get; set; }
public void Reset()
{
Console.Out.WriteLine("attempting to lock on object");
lock (this)
{
Console.Out.WriteLine("main thread got lock now");
Value1 = 0;
Value2 = 0;
}
}
}
}
申し訳ありませんが、ここに表示されるのは、解放されていない純粋なロックだけです。両方のスレッドが別のスレッドを待っている状況ではありません。ここのスレッドは、メイン スレッドが終了するのを待ちません。
class ILockMySelf
{
void doThat()
{
lock(this){ ... }
}
}
class WeveGotAProblem
{
ILockMySelf anObjectIShouldntUseToLock;
void doThis()
{
lock(anObjectIShouldntUseToLock)
{
// Following line should run in a separate thread
// for the deadlock to happen
anObjectIShouldntUseToLock.doThat();
}
}
}
こっちも一緒。実行されるスレッドdoThis
は、実行される「別のスレッド」を待っていませんdoThat
質問 :
- デッドロックはここに関係していますか?