线程同步-Barrier类
Barrier类:用于组织多个线程及时在某一个时刻碰面。并提供了一个回调函数,每次线程调用了SignalAndWait方法后该回调函数会被执行。
代码Demo:
using System;
using System.Threading;
在Main方法下面加入以下代码片段:
static Barrier _barrier = new Barrier(2,b => Console.WriteLine("End of phase {0}", b.CurrentPhaseNumber + 1));----------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();
}
}
在Main方法中加入以下代码片段:
var t1 = new Thread(() => playMusic("the guitarist", "play an amazing solo", 5));
var t2 = new Thread(() => playMusic("the singer", "sing his song", 2));
t1.Start();
t2.Start();
工作原理:
我们创建了Barrier类,指定了我们想要同步两个线程(如1行代码)。在两个线程中的任何一个调用了 _barrier.SignalAndWait()方法后,会执行一个回调函数来打印出阶段。
每个线程将向Barrier发送两次信号,所以会有两个阶段。每次这两个线程调用 SignalAndWait方法时,Barrier将执行回调函数。这在多线程迭代运算中非常有用,可以在每个迭代结束前执行一些计算。当最后一个线程调用 SignalAndWait方法时可以在迭代结束时进行交互。