C#多线程同步(七)【Barrier】

时间:2022-02-20 21:04:02

人生是一场旅程。我们经历了几次轮回,才换来这个旅程。而这个旅程很短,因此不妨大胆一些,不妨大胆一些去爱一个人,去攀一座山,去追一个梦……有很多事我都不明白。但我相信一件事。上天让我们来到这个世上,就是为了让我们创造奇迹。


Test.cs代码:

  class Test
{

//Barrier 是 .Net 提供的一直并发的机制,它允许多个任务同步他们不同阶段的并发工作。
//这里的关键点是【多个任务】和【不同阶段】。
//假设有4个相同的任务(Task),每个任务都有4个阶段(Phase),当他们并发工作时,只有当所有任务的相同步骤都完成时,所有任务才可以开始下一个步骤。
//这里的 Barrier 就是 .NetFramework 提供的一种机制。它像一个篱笆(屏障),把所有任务的阶段隔离开来,当前阶段不完成,不会开始下一个阶段。
static Barrier _barrier = new Barrier(2, b => Console.WriteLine("④阶段{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} 开始 {1}", name, message);

Thread.Sleep(TimeSpan.FromSeconds(seconds));
Console.WriteLine("③{0} 完成 {1}", name, message);
//当屏障接收到所有的参与者,participantCount: 参与线程的数量,完成某个阶段的信号后,就会执行“阶段后代码”,
//然后barrier.CurrentPhaseNumber会递增其值,表示要运行新的阶段,然后再解除阻塞每一个参与者的Task实例,然后所有参与者开始下一个阶段。
_barrier.SignalAndWait();
}
}

public static void RunTest()
{
var t1 = new Thread(() => PlayMusic("吉他手", "玩一个惊人的独奏", 5));
var t2 = new Thread(() => PlayMusic("歌手", "唱他的歌", 2));
t1.Start();
t2.Start();

Console.ReadKey();
}
}

C#多线程同步(七)【Barrier】