[英]Can you give me a simple example when I am to use “monitor” because it cannot be done with “lock”?
[英]Please can someone give me a simple example of how to use System.Monitor in C#?
我发现System.Monitor非常令人困惑,虽然我理解线程,锁,死锁,竞争条件,餐饮哲学家和所有爵士乐。 通常我使用ManualResetEvent()来进行线程间协调,但我知道这是一个重量级的内核对象,System.Monitor(Enter / Pulse等)效率更高。 我用谷歌搜索和谷歌搜索,但找不到一个明智的例子。
如果SO工作人员可以向我解释这个可能很棒的构造,我将非常感激:-)
这是一个非常简单的例子; 对Wait
的调用释放锁(允许Worker
获取它)并将Main
线程添加到lock-object的挂起队列中。 然后, Worker
获取锁定,并调用Pulse
:这会将Main
线程移动到lock-object的就绪队列中。 当Worker
释放锁时, Main
可以恢复工作。
请注意, lock(obj) {...}
只是try / finally块中Monitor.Enter
/ Monitor.Exit
编译器。
[编辑:我之前更改了示例以移动lock(sync)
,以避免错过Pulse的(不太可能)风险]
static void Main()
{
object sync = new object();
lock (sync)
{
ThreadPool.QueueUserWorkItem(Worker, sync);
Console.WriteLine("Main sleeping");
// wait for the worker to tell us it is ready
Monitor.Wait(sync);
Console.WriteLine("Main woke up!");
}
Console.WriteLine("Press any key...");
Console.ReadKey();
}
static void Worker(object sync)
{
Console.WriteLine("Worker started; about to sleep");
Thread.Sleep(5000);
Console.WriteLine("Worker about pulse");
lock (sync)
{ // notify Main that we did something interesting
Monitor.Pulse(sync);
Console.WriteLine("Worker pulsed; about to release lock");
}
Console.WriteLine("Worker all done");
}
看看我的线程文章的这一部分是否有帮助......(该页面的后半部分)。 它实现了一个生产者/消费者队列:当生产者在队列中生成某些东西(并发现它是空的 - 作为优化)时,它会激活监视器以唤醒任何等待的线程。 当消费者尝试从队列中消耗但发现它为空时,它会在再次尝试之前等待一个脉冲。
或者, Joe Albahari的线程教程也有一个关于Wait / Pulse的部分。
它与你习惯使用的WaitHandle非常相似 - 虽然坦率地说我发现比WaitHandles更容易让人头脑发热,主要是因为它与Java等待/通知类似,我“长大”了:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.