欢迎光临散文网 会员登陆 & 注册

c# 为什么不用while循环等待标志量,而用重置事件呢? AutoResetEvent / ManualReset

2023-04-06 10:22 作者:大衣哥编程  | 我要投稿
  • 利用while循环等待标志量实现多线程同步, cpu占用率极高

    bool is_ok = false;
                Task.Run(() =>
                {
                    while(!is_ok)
                    {
                        Console.WriteLine("thread 1...");
                    }
                    
                });

                Task.Run(() =>
                {
                    while (!is_ok)
                    {
                        Console.WriteLine("thread 2...");
                    }

                });
                Task.Run(() =>
                {
                    while (!is_ok)
                    {
                        Console.WriteLine("thread 3...");
                    }

                });

                Task.Run(() =>
                {
                    Console.WriteLine("thread 4 set before.");
                    Thread.Sleep(5000);
                    is_ok = true;
                    Console.WriteLine("thread 4 set after.");
                });

  • 利用AutoResetEvent:一次唤醒一个线程,cpu占用率低

    private static AutoResetEvent event_ = new AutoResetEvent(false);
            static void Main(string[] args)
            {
                Task.Run(() =>
                {
                    event_.WaitOne();
                    Console.WriteLine("thread 1...");
                });

                Task.Run(() =>
                {
                    event_.WaitOne();
                    Console.WriteLine("thread 2...");
                });

                Task.Run(() =>
                {
                    Console.WriteLine("thread 3 set before.");
                    Thread.Sleep(5000);
                    Console.WriteLine("thread 3 set after.");
                    event_.Set();   // 一次只能唤醒一个线程
                });

  • 利用 ManualReset:一次唤醒所有线程,cpu占用率低

    private static ManualResetEvent event_ = new ManualResetEvent(false);

            static void Main(string[] args)
            {
                Task.Run(() =>
                {
                    event_.WaitOne();
                    Console.WriteLine("thread 1...");
                });

                Task.Run(() =>
                {
                    event_.WaitOne();
                    Console.WriteLine("thread 2...");
                });
                Task.Run(() =>
                {
                    event_.WaitOne();
                    Console.WriteLine("thread 3...");
                });

                Task.Run(() =>
                {
                    Console.WriteLine("thread 4 set before.");
                    Thread.Sleep(5000);
                    Console.WriteLine("thread 4 set after.");
                    event_.Set();   // 一次只能唤醒一个线程
                });


c# 为什么不用while循环等待标志量,而用重置事件呢? AutoResetEvent / ManualReset的评论 (共 条)

分享到微博请遵守国家法律