c# 为什么不用while循环等待标志量,而用重置事件呢? AutoResetEvent / ManualReset
利用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(); // 一次只能唤醒一个线程
});
