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
  • 相关阅读:
    navicat设置唯一
    H5图片防盗链处理
    jar包更新
    微信小程序开发工具“当前系统代理不是安全代理”
    Set和Map
    OSS先后上传相同地址的图片
    js遍历删除数组中不符合条件的元素
    SSL配置
    关于socket.io获取客户端真实IP地址
    请在微信客户端打开链接 html
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12006822.html
Copyright © 2011-2022 走看看