Предположим, что ThreadA и ThreadB оба вызывают WaitOne()
в том же порядке в одном и том же AutoResetEvent. Когда событие установлено, почему ThreadB освобождается вместо ThreadA?
Я запустил тест, чтобы выяснить, что происходит, когда вы устанавливаете AutoResetEvent, на котором ожидают несколько потоков:
private static void Test()
{
// two threads - waiting for the same autoreset event
// start it unset i.e. closed i.e. anything calling WaitOne() will block
AutoResetEvent autoEvent = new AutoResetEvent(false);
Thread thread1 = new Thread(new ThreadStart(WriteSomeMessageToTheConsole));
thread1.Start(); // this will now block until we set the event
Thread thread2 = new Thread(new ThreadStart(WriteSomeOtherMessageToTheConsole));
thread2.Start(); // this will now also block until we set the event
// simulate some other stuff
Console.WriteLine("Doing stuff...");
Thread.Sleep(5000);
Console.WriteLine("Stuff done.");
// set the event - I thought this would mean both waiting threads are allowed to continue
// BUT thread2 runs and thread1 stays blocked indefinitely
// So I guess I was wrong and that Set only releases one thread in WaitOne()?
// And why thread2 first?
autoEvent1.Set();
}
Код, конечно, не полезен; это просто пример Микки Мауса. И это не важно / срочно. Но мне все равно было бы интересно узнать больше ...