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

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.

主站蜘蛛池模板: 疏勒县| 阳春市| 静海县| 吴堡县| 时尚| 城固县| 西充县| 温宿县| 台北县| 米林县| 微山县| 灵璧县| 铁力市| 云浮市| 金山区| 成都市| 玛沁县| 南澳县| 宾川县| 平山县| 胶州市| 资兴市| 安化县| 西乌珠穆沁旗| 乌拉特中旗| 措美县| 宝兴县| 石泉县| 赤峰市| 石阡县| 洞口县| 奉化市| 通河县| 新丰县| 巍山| 穆棱市| 开远市| 龙井市| 门源| 宁安市| 余江县|