首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C#线程同步Barrier

C#线程同步Barrier

作者头像
MaybeHC
发布2024-04-23 19:09:17
发布2024-04-23 19:09:17
4090
举报
文章被收录于专栏:技术之路技术之路

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

代码语言:javascript
复制
static Barrier _barrier = new Barrier(3, b => Console.WriteLine("1"));

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

代码语言:javascript
复制
 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()来增加或者减少需要等待的信号数量

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档