《Advanced .NET Debugging》 读书笔记 Listing 6-8: Orphaned lock的示例
时间:2011-01-09 来源:李志鹏
using System;
using System.Threading;
namespace Advanced.NET.Debugging.Chapter6
{
class Abort
{
public void WorkerThread()
{
try
{
//
// Do some work
//
}
finally
{
// Do some cleanup while holding a lock
lock (this)
{
}
}
}
public static void Main(string[] args)
{
Abort abort = new Abort();
Thread worker = new Thread(abort.WorkerThread);
lock (abort)
{
worker.Start();
Console.WriteLine("Acquired lock");
Thread.Sleep(2000);
Console.WriteLine("Aborting worker thread");
worker.Abort();
}
}
}
}
程序的问题在于, 主线程在锁定abort之后,尝试强行abort一个thread,而这个thread在被abort的时候将执finally内的lock方法。这个时候,主线程的aborrt方法将不会成功,因为abort对象已经被lock,所以finally块无法再将这个abort对象进行lock。
1. 双击运行程序 06Abort.exe
2. .loadby sos.dll mscorwks
3. .load sosex.dll
4. !dlk