c# 為什么不用while循環(huán)等待標(biāo)志量,而用重置事件呢? AutoResetEvent / ManualReset
利用while循環(huán)等待標(biāo)志量實(shí)現(xiàn)多線程同步, 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:一次喚醒一個(gè)線程,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();?? // 一次只能喚醒一個(gè)線程
??????????? });

利用 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();?? // 一次只能喚醒一個(gè)線程
??????????? });
