码迷,mamicode.com
首页 > 编程语言 > 详细

[.net 多线程]Barrier

时间:2018-05-17 22:26:23      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:logs   阶段   void   gif   开始   图片   ons   rgs   示例   

当需要【一组任务】并行地运行一连串的阶段,但是每一个阶段都要等待所有他任务完成前一阶段之后才能开始,可以通过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

[.net 多线程]Barrier

标签:logs   阶段   void   gif   开始   图片   ons   rgs   示例   

原文地址:https://www.cnblogs.com/deepminer/p/9053606.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!