zoukankan      html  css  js  c++  java
  • CountdownEvent实现并发同步

    CountdownEvent,该类包含一个需要被初始化的计数器数字,如果该计数器数字归零之后,就会释放被阻塞的线程。

    CountdownEvent.Signal()执行后,计数器会自减1;

    CountdownEvent.Wait()执行后,如果计数器归零,则会立即释放该线程;否则,就会阻塞当前线程。

    代码如下: 

            //初始化CountdownEvent,并将计数器数字初始化为2,即执行2次CountdownEvent.Signal()后,才释放被CountdownEvent.Wait()阻塞的线程
            static CountdownEvent countdownEvent = new CountdownEvent(2);
            static void WorkOnCountdownEvent(string threadName)
            {
                Console.WriteLine($"{threadName} 正在等待中...");
                Console.WriteLine($"{threadName} 执行中...");
                Thread.Sleep(1000);
                Console.WriteLine($"{threadName} 执行完毕!");
                if(countdownEvent.CurrentCount>0)
                    countdownEvent.Signal();
                Console.WriteLine($"{threadName} CountdownEvent'count={countdownEvent.CurrentCount}");
            }

    Main方法中的代码如下所示:

           for (int i = 0; i < 2; i++) {
                    string threadName = $"thread_{i}";
                    var thread = new Thread(delegate ()
                    {
                        WorkOnCountdownEvent(threadName);
                    });
                    thread.Start();
                }
    
                countdownEvent.Wait();
                Console.WriteLine("主线程 执行完毕!");

    结果如下所示:

     正如结果所示,当CountdownEvent.CurrentCount归零时,被阻塞的主线程才会被释放并继续执行。

    CountdownEvent的功能不止如此,具体详参:https://docs.microsoft.com/zh-cn/dotnet/standard/threading/countdownevent

  • 相关阅读:
    BZOJ3997:[TJOI2015]组合数学(DP,Dilworth定理)
    BZOJ4807:車(组合数学,高精度)
    BZOJ4008:[HNOI2015]亚瑟王(DP,概率期望)
    BZOJ1499:[NOI2005]瑰丽华尔兹(DP,单调队列)
    洛谷1514 引水入城
    洛谷 1018 乘积最大
    八数码难题
    CODEVS 1069关押罪犯
    CODEVS 1067 机器翻译
    洛谷 P1417 烹调方案
  • 原文地址:https://www.cnblogs.com/williamwsj/p/13856502.html
Copyright © 2011-2022 走看看