线程同步-Barrier类

本文介绍Barrier类的应用场景,通过一个示例演示如何使用Barrier来同步多个线程,并在每个线程完成任务时触发回调函数。具体展示了如何创建Barrier实例、定义回调函数以及线程间如何通过Barrier进行协调。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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方法时可以在迭代结束时进行交互。

转载于:https://www.cnblogs.com/v-haoz/p/9261878.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值