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

  • 相关阅读:
    什么是HTTPS协议
    思维:从互联网到区块链
    BFT-SMaRt:用Netty做客户端的可靠信道
    BFT-SMaRt:用Java做节点间的可靠信道
    共识网络BFT-SMaRt:理论与实践
    EOS源码分析:transaction的一生
    勘误:EOS资源抵押退还
    如何踩中下一个技术节拍
    本人新书,欢迎抢购
    REX:EOS资源租赁平台详解
  • 原文地址:https://www.cnblogs.com/williamwsj/p/13856502.html
Copyright © 2011-2022 走看看