2016-12-16 131 views
0

我刚开始学习一个Barrier如何在udemy的教程和程序多线程中用于线程化茶的思想。我的程序中有多个barrier.SignalAndWait(),我很困惑它是如何工作的?根据我的理解,程序在看到SignalAndWait时等待,它会激活已完成的阶段。我猜从那里,这行是打印Console.WriteLine("Phase " + b.CurrentPhaseNumber + " is finished");。这是对的还是有更多的呢?Barrier SignalAndWait()如何在这种情况下工作?

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. 首先控制台输出可以“把水壶......”或“寻找最好的......”因为多线程的。

  2. 然后water任务的线程进入睡眠状态和cup任务开始通过呼叫等待water线程的觉醒barrier.SignalAndWait();

  3. 然后当water线程醒来后,开始通过电话barrier.SignalAndWait();等待cup任务

  4. 由于障碍已经配置了2名参与者,我们有控制台输出“阶段0结束”

  5. 然后再次,我们无法预测谁先输出,所以下一条消息将是“添加茶”。从cup线程或“倒水..”从water线程。

  6. 然后接下来的步骤显然取决于谁在上一步首先开始。因此,如果cup任务首先启动,则它将通过barrier.SignalAndWait();发信号并等待water任务,然后water向障碍实体发送信号,表明它已通过barrier.SignalAndWait();准备好。

  7. 而同样的情况在步骤(4),但相将会增加,我们将有“第1阶段结束”

  8. 话又说回来,我们不能预测谁将会首先输出,所以下一条消息将从cup线程中的water线程或“添加一个糖..”中“将水壶放开”。

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

对于进一步阅读,我可以建议this MSDN文章,一个很好的例子。

相关问题