C#多线程编程笔记-使用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方法时可以在迭代结束时进行交互。

猜你喜欢

转载自blog.csdn.net/qq_35445058/article/details/80746176