C#多线程编程笔记(2.6)-使用Barrier类

C#多线程编程: Barrier类实践解析
本文介绍了在学习《C#多线程编程实战》时关于 Barrier 类的笔记。通过示例展示了如何使用 Barrier 类进行线程同步,特别强调了在两个线程间创建两个阶段的同步,并解释了在每个阶段结束时如何执行回调函数,这对于多线程迭代运算的场景十分有用。

近来在学习Eugene Agafonov编写的《C#多线程编程实战》(译),做些笔记也顺便分享一下^-^

using System;
using System.Threading;

namespace Barrier_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            var t1 = new Thread(() => PlayMusic("the guitarist", "play an amazing solo", 5));
            var t2 = new Thread(() => PlayMusic("the singer", "sing the song", 2));

            t1.Start();
            t2.Start();

            Console.ReadKey();
        }

        static Barrier _barrier = new Barrier(2, b => Console.WriteLine("End of phase {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} starts to {1}", name, message);
                Thread.Sleep(TimeSpan.FromSeconds(seconds));
                Console.WriteLine("{0} finishes to {1}", name, message);
                _barrier.SignalAndWait();
            }
        }
    }
}

程序运行结果如下


我们创建了Barrier类,指定了我们想要同步两个线程,在两个线程中的任何一个调用了_barrier.SignalAndWait方法后,会执行一个回调函数来打印出阶段。

每个线程将向Barrier发送两次信号,所以会有两个阶段。每次这两个线程调用SignalAndWait方法时,Barrier将会执行回调函数。这在多线程迭代运算中非常有用,可以在每个迭代结束前执行一些计算。当最后一个线程调用SignalAndWait方法时可以在迭代结束时进行交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值