我发现System.Monitor非常令人困惑,虽然我理解线程,锁,死锁,竞争条件,餐饮哲学家和所有爵士乐.通常我使用ManualResetEvent()来进行线程间协调,但我知道这是一个重量级的内核对象,System.Monitor(Enter/Pulse等)效率更高.我用谷歌搜索和谷歌搜索,但找不到一个明智的例子.
如果SO工作人员可以向我解释这个可能很棒的构造,我将非常感激:-)
这是一个非常简单的例子; 调用Wait释放锁(允许Worker获取它)并将Main线程添加到锁对象的挂起队列中.Worker然后获取锁,并调用Pulse:这会将Main线程移动到锁对象的就绪队列中.当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");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
488 次 |
| 最近记录: |