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()来增加或者减少需要等待的信号数量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Maybe_ch

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值