zoukankan      html  css  js  c++  java
  • 线程同步-Barrier类

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

  • 相关阅读:
    关于Request.Form和动态添加服务器控件
    httpCookies
    简单的重写重置SessionID
    C# 内置类型表
    加密Web.Config(小技巧)
    C#委托实现系统回调
    C#中将字符串转成 Base64 编码(小技巧)
    关于跨域的SessionID的问题
    *.ashx文件
    Session中丢失的问题解决
  • 原文地址:https://www.cnblogs.com/v-haoz/p/9261878.html
Copyright © 2011-2022 走看看