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

  • 相关阅读:
    Go-day01
    M1-Flask-Day2
    M1-Flask-Day1
    Tornado基于MiddleWare做中间件
    SqlAlchenmy基本使用
    PV、UV、UIP、VV、CPC、CPM、RPM、CTR解释
    Celery笔记
    Celery 分布式任务队列快速入门
    库操作
    Django cache
  • 原文地址:https://www.cnblogs.com/williamwsj/p/13856502.html
Copyright © 2011-2022 走看看