Barrier類的使用,可作爲多線程間的信號量

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace BarrierDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var t1 = new Thread(() => PlayGame("the player", "on line", 5));
            var t2 = new Thread(() => PlayGame("the game", "opening", 2));
            t1.Start();
            t2.Start();

            Console.ReadKey();
        }

        static Barrier _barrier = new Barrier(2, b => Console.WriteLine($"End of phase{b.CurrentPhaseNumber + 1}"));

        static void PlayGame(string name, string message, int seconds)
        {
            for(int i = 1; i < 3;i++)
            {
                Console.WriteLine("---------------------------------------------");
                Thread.Sleep(TimeSpan.FromSeconds(seconds));
                Console.WriteLine($"{name} starts to {message}");
                Thread.Sleep(TimeSpan.FromSeconds(seconds));
                Console.WriteLine($"{name} finishes to {message}");
                _barrier.SignalAndWait();
            }
        }
    }
}

  當設定了_barrier實例中參與線程的數量,其中任何一個線程發出了信號_barrier.SignalAndWait()並開始等待,直到剩下的所有線程都發出信號,纔開始往下走。可以理解爲:一輛車在等人,人齊了就走,人不齊就所有人都等着。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章