zoukankan      html  css  js  c++  java
  • [.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

  • 相关阅读:
    JSON基本操作
    常用的windowd属性和对象
    手动建立数据库连接的BaseDAO
    注意1:图像插值理论的理解
    Python的Scikit-learn如何选择合适的机器学习算法?
    spark-sklearn(spark扩展scikitlearn)
    Tips-Windows 10【多桌面视窗】操作
    jupyter notebook快捷键速查手册
    使用IntelliJ IDEA进行Python远程调试的需求(未完)
    Bazel构建工具的安装
  • 原文地址:https://www.cnblogs.com/deepminer/p/9053606.html
Copyright © 2011-2022 走看看