我刚刚开始学习如何在udemy的教程中使用屏障,并且程序多线程化了制作茶的意识形态。我的程序中有多个barrier.SignalAndWait()
,我很困惑它是如何工作的?根据我的理解,程序会在看到SignalAndWait
时等待,并激活已完成的阶段。我想从那里开始,这条线被打印Console.WriteLine("Phase " + b.CurrentPhaseNumber + " is finished");
。这是正确的还是还有更多呢?
static Barrier barrier = new Barrier(2, b=> {
Console.WriteLine("Phase " + b.CurrentPhaseNumber + " is finished");
});
public static void Water()
{
Console.WriteLine("Putting the kettle on (takes a bit longer)");
Thread.Sleep(2000);
barrier.SignalAndWait();
Console.WriteLine("Pouring water into cup.");
barrier.SignalAndWait();
Console.WriteLine("Putting the kettle away");
}
public static void Cup()
{
Console.WriteLine("Finding the nicest cup of tea (fast)");
barrier.SignalAndWait();
Console.WriteLine("Adding tea.");
barrier.SignalAndWait();
Console.WriteLine("Adding a sugar");
}
static void Main(string[] args)
{
var water = Task.Factory.StartNew(Water);
var cup = Task.Factory.StartNew(Cup);
var tea = Task.Factory.ContinueWhenAll(new[] { water, cup }, tasks =>
{
Console.WriteLine("Enjoy your cup of tea");
});
tea.Wait();
Console.WriteLine("Main program done");
Console.ReadKey();
}
答案 0 :(得分:1)
我会尝试解释发生了什么:
由于多线程,第一个控制台输出可以是“放水壶......”或“找到最好的......”。
然后water
任务的线程进入休眠状态,cup
任务开始等待water
线程通过调用barrier.SignalAndWait();
唤醒
然后当water
线程被唤醒时,它会通过调用cup
开始等待barrier.SignalAndWait();
任务
由于Barrier已为2名参与者配置,我们的控制台输出“阶段0已完成”
然后,我们无法预测谁将首先输出,因此下一条消息将是“添加茶”。来自cup
主题的water
主题或“Pouring water ..”。
然后接下来的步骤显然取决于谁在上一步中首先开始。因此,如果cup
任务首先启动,则会通过water
发出信号并等待barrier.SignalAndWait();
任务,然后water
向障碍实体发出信号,告知它已通过{{1}准备就绪}。
与(4)步骤中的情况相同,但阶段将增加,我们将“阶段1完成”
然后,再次,我们无法预测谁将首先输出,所以下一条消息将是barrier.SignalAndWait();
线程中的“放水壶”或“添加糖......”{{1} } thread。
water
和cup
任务完成了他们的工作,我们将“享用您的一杯茶”,然后“完成主程序”输出。
为了进一步阅读,我可以建议this MSDN文章作为一个很好的例子。