[.net 多线程]Barrier

当需要【一组任务】并行地运行一连串的阶段,但是每一个阶段都要等待所有他任务完成前一阶段之后才能开始,可以通过Barrier实例来同步这一类协同工作。
Barrier初始化后,将等待特定数量的信号到来,这个数量在Barrier初始化时指定,在所指定的信号个数已经到来后,Barrier将执行一个指定的动作,这个动作也是在Barrier初始化时指定。Barrier在执行动作过后,将会重置,这时又将等待特定数量的信号到来,再执行指定动作。信号通过成员函数SignalAndWait()来发送,执行SignalAndWait()函数的Task或者线程将会投入等待,Barrier将等待特定数量的信号到达,然后Barrier执行完指定动作后被重置,这时SignalAndWait()函数所在的Task或者线程将继续运行。在程序的运行过程中,可以通过成员函数AddParticipant()和RemoveParticpant()来增加或者减少需要等待的信号数量

 1 public static void Phase1(int taskId)
 2 {
 3     Console.WriteLine($"Task[{taskId}] complete phase1");
 4 }
 5 public static void Phase2(int taskId)
 6 {
 7     Console.WriteLine($"Task[{taskId}] complete phase2");
 8 }
 9 public static void Phase3(int taskId)
10 {
11     Console.WriteLine($"Task[{taskId}] complete phase3");
12 }
13 public static void Phase4(int taskId)
14 {
15     Console.WriteLine($"Task[{taskId}] complete phase4");
16 }
17 static void Main(string[] args)
18 {
19     Barrier barrier = new Barrier(3);
20     int taskId = 0;
21     for (int i = 0; i < 3; i++)
22     {
23         Task.Factory.StartNew(() =>
24         {
25             int cur = Interlocked.Increment(ref taskId);
26             Phase1(cur);
27             barrier.SignalAndWait();
28             Phase2(cur);
29             barrier.SignalAndWait();
30             Phase3(cur);
31             barrier.SignalAndWait();
32             Phase4(cur);
33             barrier.SignalAndWait();
34         });
35     }
36     Console.ReadKey();
37 }
Barrier示例

任务执行流程如下:

执行结果:

Task1/Task2/Task3在phase1都执行完后,才会接着执行phase2

 Barrier代码实现分析:https://www.cnblogs.com/majiang/p/7898027.html

猜你喜欢

转载自www.cnblogs.com/deepminer/p/9053606.html