与Monitor的线程同步.脉搏不正常
本文关键字:脉搏 不正常 同步 线程 Monitor | 更新日期: 2023-09-27 18:05:44
我有两个方法,first()和second(),我将它们分配给两个线程。
下面是我的第二个和第一个方法
public void first()
{
lock (this)
{
Monitor.Wait(this);
Console.WriteLine("First");
Monitor.Pulse(this);
}
}
public void second()
{
lock (this)
{
//Monitor.Wait(this);
Console.WriteLine("Second");
Monitor.Pulse(this);
}
}
问题是在控制台上只有"Second"被打印出来。尽管我在second()中有Monitor.Pulse()来通知控件应该移动到first(),但这并没有发生。
我正在跟踪msdn跟踪https://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx
任何帮助将感激信息为什么s
线程不转移到f
线程与Monitor.Pulse()
在第二()
下面是我的Main()
test t = new test();
test1 t1 = new test1();
Thread f = new Thread(new ThreadStart(t.first));
Thread s = new Thread(new ThreadStart(t1.second));
f.Start();
s.Start();
f.Join();
s.Join();
这个生产者/消费者的例子只作用于一个cell实例。我觉得你也应该这么做。对于"第一"answers"第二",对"this
"的引用是不同的。
由于您初始化了Test
-类的两个实例(或者您有两个单独的类,Test
和Test1
),因此您在两个方法中使用this
-关键字指的是两个单独的对象。
不锁定上下文对象,而是创建一个两个方法都可以访问的静态对象,并锁定它:
public class Test
{
static object _key = new object();
public void First()
{
lock (_key)
{
Monitor.Wait(_key);
Console.WriteLine("First");
Monitor.Pulse(_key);
}
}
public void Second()
{
lock (_key)
{
Console.WriteLine("Second");
Monitor.Pulse(_key);
}
}
}
将First()
和Second()
放在同一个类中,并创建该类的两个实例,而不是一个Test
和一个Test1
,您应该看到您期望的结果,即程序的输出将是
Second
First
编辑:正如Damien指出的那样,这也不能保证工作,因为它假设First()
是第一个获得锁的。