如果您需要等待多个线程,@Reed 提供了一个优雅的解决方案。
您可能不想使用Monitor
它。正如@Reed指出的那样,一个事件就足够了,并且会提供符合您的代码要求的最简洁和最易理解的解决方案。
在您的情况下,使用真正的操作系统同步原语的开销很可能无关紧要,使用 egMonitor
只会以更高的复杂性为代价提供递减的回报。
话虽如此,这是一个使用Monitor
和信令的实现。
您可以使用bool
由锁保护的标志来指示您已完成并避免在这种情况下等待。(A)
如果您真的Function2()
在注释指示的地方开始一个新线程并在两者lock()
周围使用and ,则根本不需要该标志。(乙) WaitOne()
Release()
A、使用标志:
class Program
{
static object syncRoot = new object();
//lock implies a membar, no need for volatile here.
static bool finished = false;
static byte b;
public static byte Function1()
{
lock (syncRoot)
{
//Wait only if F2 has not finished yet.
if (!finished)
{
Monitor.Wait(syncRoot);
}
}
return b;
}
static public void Function2()
{
// do some thing
b = 1;
lock (syncRoot)
{
finished = true;
Monitor.Pulse(syncRoot);
}
}
static void Main(string[] args)
{
new Thread(Function2).Start();
Console.WriteLine(Function1());
}
}
B,从以下开始一个线程Function1
:
class Program
{
static object syncRoot = new object();
static byte b;
public static byte Function1()
{
lock (syncRoot)
{
// new thread starting in Function2;
new Thread(Function2).Start();
Monitor.Wait(syncRoot);
}
return b;
}
static public void Function2()
{
// do some thing
b = 1;
//We need to take the lock here as well
lock (syncRoot)
{
Monitor.Pulse(syncRoot);
}
}
static void Main(string[] args)
{
Console.WriteLine(Function1());
}
}