zoukankan      html  css  js  c++  java
  • .NET 4 System.Threading.Barrier 类

    Visual Studio 2010 and .NET Framework 4 Training Kit中有个System.Threading.Barrier的Demo,通过Barrier Class我们可以控制线程的运行,做到线程同步的效果。

    Barrier Class在使用上十分的简单,只要在Barrier的构造函数中传入participantCount(简单的说就是要等待的线程个数),并在要同步的点调用SignalAndWait方法就可以了。线程会在调用SignalAndWait之后暂停运行,等待所有参与的线程都到达了同步点才继续往下运行。

    举个例子来看,假设今天Charlie、Mac、Dennis三个人相约要去西雅图喝咖啡。由于三个人的住的地区不尽相同,且车子都需要加油,因此他们约在途中会经过的加油站待会合后一同前往。这样的情境我们可以通过Thread与Barrier用程序仿真出来。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;

    namespace BarrierDemo
    {
        class Program
        {
            static Barrier sync;
            static CancellationToken token;

            static void Main(string[] args)
            {
                var source = new CancellationTokenSource();
                token = source.Token;
                sync = new Barrier(3);

                var charlie = new Thread(() => DriveToBoston("Charlie", TimeSpan.FromSeconds(1))); charlie.Start();
                var mac = new Thread(() => DriveToBoston("Mac", TimeSpan.FromSeconds(2))); mac.Start();
                var dennis = new Thread(() => DriveToBoston("Dennis", TimeSpan.FromSeconds(3))); dennis.Start();

                //source.Cancel();

                charlie.Join();
                mac.Join();
                dennis.Join();

                Console.ReadKey();
            }

            static void DriveToBoston(string name, TimeSpan timeToGasStation)
            {
                try
                {
                    Console.WriteLine("[{0}] Leaving House", name);

                    // Perform some work
                    Thread.Sleep(timeToGasStation);
                    Console.WriteLine("[{0}] Arrived at Gas Station", name);

                    // Need to sync here
                    sync.SignalAndWait(token);

                    // Perform some more work
                    Console.WriteLine("[{0}] Leaving for Boston", name);
                }
                catch (OperationCanceledException)
                {
                    Console.WriteLine("[{0}] Caravan was cancelled! Going home!", name);
                }
            }
        }
    }

    欢迎大家扫描下面二维码成为我的客户,为你服务和上云

  • 相关阅读:
    【翻译/介绍】jump consistent hash:零内存消耗,均匀,快速,简洁,来自Google的一致性哈希算法 [2015-03-13]
    现代密码学实践指南[2015年]
    本博客迁走了
    高性能web系统的架构和系统优化
    vs 2013调试的时候重启的解决方案
    年会与项目管理
    javascript 关闭窗口,弹出新窗口并带有确认关闭对话框解决办法
    成长
    POCO exception
    通过OpenGL ES在iOS平台实践增强现实(二)
  • 原文地址:https://www.cnblogs.com/shanyou/p/1590865.html
Copyright © 2011-2022 走看看