官术网_书友最值得收藏!

Using the Barrier construct

This recipe illustrates another interesting synchronization construct called Barrier. The Barrier construct helps to organize several threads so that they meet at some point in time, providing a callback that will be executed each time the threads call the SignalAndWait method.

Getting ready

To step through this recipe, you will need Visual Studio 2015. There are no other prerequisites. The source code for this recipe can be found at BookSamples\Chapter2\Recipe7.

How to do it...

To understand the use of the Barrier construct, perform the following steps:

  1. Start Visual Studio 2015. Create a new C# console application project.
  2. In the Program.cs file, add the following using directives:
    using System;
    using System.Threading;
    using static System.Console;
    using static System.Threading.Thread;
  3. Below the Main method, add the following code:
    static Barrier _barrier = new Barrier(2,
      b => WriteLine($"End of phase {b.CurrentPhaseNumber + 1}"));
    
    static void PlayMusic(string name, string message, int seconds)
    {
      for (int i = 1; i < 3; i++)
      {
        WriteLine("----------------------------------------------");
        Sleep(TimeSpan.FromSeconds(seconds));
        WriteLine($"{name} starts to {message}");
        Sleep(TimeSpan.FromSeconds(seconds));
        WriteLine($"{name} finishes to {message}");
        _barrier.SignalAndWait();
      }
    }
  4. Inside the Main method, add the following code:
    var t1 = new Thread(() => PlayMusic("the guitarist", "play an amazing solo", 5));
    var t2 = new Thread(() => PlayMusic("the singer", "sing his song", 2));
    
    t1.Start();
    t2.Start();
  5. Run the program.

How it works...

We create a Barrier construct, specifying that we want to synchronize two threads, and after each of those two threads call the _barrier.SignalAndWait method, we need to execute a callback that will print out the number of phases completed.

Each thread will send a signal to Barrier twice, so we will have two phases. Every time both the threads call the SignalAndWait method, Barrier will execute the callback. It is useful for working with multithreaded iteration algorithms, to execute some calculations on each iteration end. The end of the iteration is reached when the last thread calls the SignalAndWait method.

主站蜘蛛池模板: 鹤庆县| 根河市| 晋州市| 宁城县| 蓬溪县| 奉化市| 旅游| 十堰市| 沙河市| 许昌市| 龙陵县| 和静县| 广州市| 久治县| 南昌市| 廉江市| 忻城县| 社会| 林口县| 鲜城| 嘉峪关市| 鹤岗市| 临沂市| 西峡县| 浏阳市| 青田县| 衡山县| 津市市| 鄂托克前旗| 济南市| 陵川县| 翁牛特旗| 阿克苏市| 广东省| 土默特左旗| 庆城县| 夏津县| 杨浦区| 革吉县| 珠海市| 全南县|