考虑以下阻塞生产者和使用者线程的实现:
static void Main(string[] args)
{
var syncRoot = new object();
var products = new List<int>();
Action producer = () => {
lock (syncRoot)
{
var counter = 0;
while (true)
{
products.Add(counter++);
Monitor.Pulse(syncRoot);
Monitor.Wait(syncRoot);
}
}};
Action consumer = () => {
lock (syncRoot)
while (true)
{
Monitor.Pulse(syncRoot);
products.ForEach(Console.WriteLine);
products.Clear();
Thread.Sleep(500);
Monitor.Wait(syncRoot);
}};
Task.Factory.StartNew(producer);
Task.Factory.StartNew(consumer);
Console.ReadLine();
}假设当生成线程进入Monitor.Wait时,它等待两件事情:
在上面的代码中,我在Pulse和Wait调用之间做了大量的工作。
因此,如果我这样写我的消费线程(在等待之前立即执行):
Action consumer = () =>
{
lock (syncRoot)
while (true)
{
products.ForEach(Console.WriteLine);
products.Clear();
Thread.Sleep(500);
Monitor.Pulse(syncRoot);
Monitor.Wait(syncRoot);
}
};我没注意到行为上有任何变化。这方面有什么指引吗?我们是否应该在紧接Pulse之前使用Wait,还是在性能方面存在差异?
发布于 2014-01-30 20:18:06
Wait,执行更改的线程使用Pulse。线程可以两者兼顾,但一般实践取决于具体情况。Wait,这很好,并且在等待期间不持有锁。https://stackoverflow.com/questions/21465733
复制相似问题