C#线程同步Barrier

Barrier中提供了一个回调函数,每个线程调用SignalAndWait方法后该回调函数会被执行。
eg:

static Barrier _barrier = new Barrier(3, b => Console.WriteLine("1"));

在上面我们初始化了一个Barrier,并在构造中设置为将等待的信号数量为3,这就意味着如何想好执行回调函数Console.WriteLine("1"),则需要在线程中执行三次_barrier.SignalAndWait();这样才能释放线程并执行回调函数
下面举个例子

 static Barrier _barrier = new Barrier(2, b => Console.WriteLine("End of phase {0}", b.CurrentPhaseNumber + 1));
        static void PlayMusic(string name ,int seconds)
        {
            for(int i = 1; i < 3; i++)
            {
                Console.WriteLine("--------------------");
                Thread.Sleep(TimeSpan.FromSeconds(seconds));
                Console.WriteLine("{0}线程启动",name);
                Thread.Sleep(TimeSpan.FromSeconds(seconds));
                Console.WriteLine("{0}线程完成",name);
                _barrier.SignalAndWait();
            }
        }
        static void Main(string[] args)
        {
            var t1 = new Thread(() => PlayMusic("a", 5));
            var t2 = new Thread(() => PlayMusic("b", 2));
            t1.Start();
            t2.Start();

            Console.ReadKey();
        }

我们直接来看看运行的情况
在这里插入图片描述
很明显要想Barrier中的回调函数并释放线程,必须调用两次_barrier.SignalAndWait();,代码中在a线程调用了一次,b线程调用了一次,Barrier信号量未到达2时将一直处于阻塞状态。

在程序的运行过程中,可以通过成员函数AddParticipant()和RemoveParticpant()来增加或者减少需要等待的信号数量

猜你喜欢

转载自blog.csdn.net/Maybe_ch/article/details/84861621
今日推荐