Monitor.Pulse 的线程同步未按预期工作
Thread synchronization with Monitor.Pulse NOT working as expected
我有两个方法,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()
in second()
的信息,我们将不胜感激
Follwinng 是我的 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();
生产者/消费者示例适用于一个单元实例。我认为你也应该这样做。您的 'first' 和 'second' 对“this
”的引用不同。
由于您初始化了 Test
-class 的两个实例(或者您有两个单独的 classes,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()
放在同一个 class 中,并创建该 class 的两个实例,而不是一个 Test
和一个 Test1
,您应该会看到预期的结果,即程序的输出将是
Second
First
编辑:与一样,这也不能保证有效,因为它假定First()
是第一个获得锁的人。
我有两个方法,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()
in second()
Follwinng 是我的 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();
生产者/消费者示例适用于一个单元实例。我认为你也应该这样做。您的 'first' 和 'second' 对“this
”的引用不同。
由于您初始化了 Test
-class 的两个实例(或者您有两个单独的 classes,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()
放在同一个 class 中,并创建该 class 的两个实例,而不是一个 Test
和一个 Test1
,您应该会看到预期的结果,即程序的输出将是
Second
First
编辑:与First()
是第一个获得锁的人。