C#多线程同步(七)【Barrier】

人生是一场旅程。我们经历了几次轮回,才换来这个旅程。而这个旅程很短,因此不妨大胆一些,不妨大胆一些去爱一个人,去攀一座山,去追一个梦……有很多事我都不明白。但我相信一件事。上天让我们来到这个世上,就是为了让我们创造奇迹。


Test.cs代码:

  class Test
    {

        //Barrier 是 .Net 提供的一直并发的机制,它允许多个任务同步他们不同阶段的并发工作。
        //这里的关键点是【多个任务】和【不同阶段】。
        //假设有4个相同的任务(Task),每个任务都有4个阶段(Phase),当他们并发工作时,只有当所有任务的相同步骤都完成时,所有任务才可以开始下一个步骤。
        //这里的 Barrier 就是 .NetFramework 提供的一种机制。它像一个篱笆(屏障),把所有任务的阶段隔离开来,当前阶段不完成,不会开始下一个阶段。
        static Barrier _barrier = new Barrier(2, b => Console.WriteLine("④阶段{0} 结束", b.CurrentPhaseNumber + 1));
        static void PlayMusic(string name, string message, int seconds)
        {
            for (int i = 1; i < 3; i++)
            {
                Console.WriteLine("①---------------------------------------------");
                Thread.Sleep(TimeSpan.FromSeconds(seconds));
                Console.WriteLine("②{0} 开始 {1}", name, message);

                Thread.Sleep(TimeSpan.FromSeconds(seconds));
                Console.WriteLine("③{0} 完成 {1}", name, message);
                //当屏障接收到所有的参与者,participantCount: 参与线程的数量,完成某个阶段的信号后,就会执行“阶段后代码”,
                //然后barrier.CurrentPhaseNumber会递增其值,表示要运行新的阶段,然后再解除阻塞每一个参与者的Task实例,然后所有参与者开始下一个阶段。
                _barrier.SignalAndWait();
            }
        }

        public static void RunTest()
        {
            var t1 = new Thread(() => PlayMusic("吉他手", "玩一个惊人的独奏", 5));
            var t2 = new Thread(() => PlayMusic("歌手", "唱他的歌", 2));
            t1.Start();
            t2.Start();

            Console.ReadKey();
        }
    }

这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值