我有两个方法,第一个()和第二个(),我将它们分配给两个线程。
以下是我的第二个和第一个方法
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()但是发生了这种情况。
我在https://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx
之后关注msdn如果s
主题没有将控制转移到f
线程Monitor.Pulse()
第二个()
Follwinng是我的主要()
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();
答案 0 :(得分:4)
生产者/消费者示例适用于一个单元实例。我想你应该这样做。对于“第一个”和“第二个”,“this
”的引用不同。
答案 1 :(得分:1)
由于您初始化了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 points out though,这也不保证可以正常工作,因为它假定First()
是第一个获得锁定的人。