【发布时间】:2018-03-02 06:21:54
【问题描述】:
有一句话:
推荐模式
这些队列可能导致意外行为。当脉冲发生时,等待队列的头部被释放并被添加到就绪队列中。但是,如果就绪队列中还有其他线程,它们将在被释放的线程之前获得锁。这是一个问题,因为获取锁的线程可以改变脉冲线程所依赖的状态。
解决办法是在lock语句中使用while条件:
readonly object key = new object(); bool block = true; // thread A lock ( key ) { while ( block ) Monitor.Wait( key ); block = true; } // thread B lock ( key ) { block = false; Monitor.Pulse( key ); }
作者说 ThreadC 会首先获得 _locker,但在我运行三个线程的演示中,我发现这不是真的。 ThreadC 最后获得 _locker。
这是我的代码:
class Program
{
private static readonly object _locker = new object();
public static void ThreadA()
{
new Thread(() =>
{
lock (_locker)
{
Console.WriteLine("Thread A acquire lock then wait threadId {0}", Thread.CurrentThread.ManagedThreadId);
Monitor.Wait(_locker);
Thread.Sleep(1000);
Console.WriteLine("Thread A Continue .. threadId {0}", Thread.CurrentThread.ManagedThreadId);
}
}).Start();
}
public static void ThreadB()
{
new Thread(() =>
{
lock (_locker)
{
Console.WriteLine("Thread B acquire lock...then pulse threadId {0}",Thread.CurrentThread.ManagedThreadId);
Monitor.Pulse(_locker);
Thread.Sleep(1000);
Console.WriteLine("Thread B sleep...then realse the locker threadId {0}", Thread.CurrentThread.ManagedThreadId);
}
}).Start();
}
public static void ThreadC()
{
new Thread(ThreadA).Start();
}
static void Main(string[] args)
{
ThreadA();
Thread.Sleep(10); // ensure threadA get _locker firstly
ThreadB();
ThreadC();
}
}
【问题讨论】:
-
显示测试程序的输出。
标签: c# multithreading