zoukankan      html  css  js  c++  java
  • 事件锁-AutoResetEvent介绍及使用场景

    AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。

    线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程
    通过调用 Set 发出资源可用的信号。

    调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

    等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。

    下面例子有三个线程,使用事件锁来实现同步执行:

    static void Main(string[] args)
            {
                var t1ResetEvent = new AutoResetEvent(false);
                var t2ResetEvent = new AutoResetEvent(false);
                var t3ResetEvent = new AutoResetEvent(false);
                Task t1 = new Task(() =>
                {
                    while (true)
                    {
                        if (t1ResetEvent.WaitOne())
                        {
                            Console.WriteLine("t1");
                            Thread.Sleep(500);
                            t2ResetEvent.Set();
                        }
                    }
                });
                Task t2 = new Task(() =>
                {
                    while (true)
                    {
                        if (t2ResetEvent.WaitOne())
                        {
                            Console.WriteLine("t2");
                            Thread.Sleep(500);
                            t3ResetEvent.Set();
                        }
                    }
                });
                Task t3 = new Task(() =>
                {
                    while (true)
                    {
                        if (t3ResetEvent.WaitOne())
                        {
                            Console.WriteLine("t3");
                            Thread.Sleep(500);
                        }
                    }
                });
                t1.Start();
                t2.Start();
                t3.Start();
                t1ResetEvent.Set();
                Thread.Sleep(3000);
                t1ResetEvent.Set();
                Thread.Sleep(3000);
                t1ResetEvent.Set();
                Console.ReadKey();
            }
    
    //结果 t1、t2、t3、t1、t2、t3、t1、t2、t3
  • 相关阅读:
    Pytorch——张量 Tensors
    Pytorch——cuda的使用
    神经网络训练模型的两种写法
    Pytorch——torch.nn.init 中实现的初始化函数
    线性回归的简洁实现
    Pytorch——net.parameters()参数获取
    Tensor和NumPy相互转换
    Codeforces Round #600 (Div. 2) A、B
    2020-2021 ACM-ICPC, Asia Seoul Regional Contest G. Mobile Robot
    大组合数模板
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12006822.html
Copyright © 2011-2022 走看看