Barrier SignalAndWait()如何在这种情况下工作?

时间:2016-12-16 23:48:16

标签: c# multithreading

我刚刚开始学习如何在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();
    }

1 个答案:

答案 0 :(得分:1)

我会尝试解释发生了什么:

  1. 由于多线程,第一个控制台输出可以是“放水壶......”或“找到最好的......”。

  2. 然后water任务的线程进入休眠状态,cup任务开始等待water线程通过调用barrier.SignalAndWait();唤醒

    < / LI>
  3. 然后当water线程被唤醒时,它会通过调用cup开始等待barrier.SignalAndWait();任务

  4. 由于Barrier已为2名参与者配置,我们的控制台输出“阶段0已完成”

  5. 然后,我们无法预测谁将首先输出,因此下一条消息将是“添加茶”。来自cup主题的water主题或“Pouring water ..”。

  6. 然后接下来的步骤显然取决于谁在上一步中首先开始。因此,如果cup任务首先启动,则会通过water发出信号并等待barrier.SignalAndWait();任务,然后water向障碍实体发出信号,告知它已通过{{1}准备就绪}。

  7. 与(4)步骤中的情况相同,但阶段将增加,我们将“阶段1完成”

  8. 然后,再次,我们无法预测谁将首先输出,所以下一条消息将是barrier.SignalAndWait();线程中的“放水壶”或“添加糖......”{{1} } thread。

  9. watercup任务完成了他们的工作,我们将“享用您的一杯茶”,然后“完成主程序”输出。

  10. 为了进一步阅读,我可以建议this MSDN文章作为一个很好的例子。