0
请看下面的测试片段:如何确保这个多线程问题的不确定结果?
// act
AutoResetEvent workDoneEvent = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem(delegate
{
ProcessAndSignal(processor, workDoneEvent);
}, null);
// let worker thread have a go
workDoneEvent.WaitOne();
blockingFetcher.WaitForNextMessage = false;
// assert
Assert.That(processor.StopCause, Is.Null);
}
private static void ProcessAndSignal(MessageProcessor processor, AutoResetEvent workDoneEvent)
{
workDoneEvent.Set();
// this invocation will block until the WaitForNextMessageFlag is set
processor.ProcessMessages();
}
理想的方案:
- ProcessAndSignalMethod排队线程池,但没有开始执行。
- 主线程块(autoResetEvent.WaitOne())
- 辅助线程开始执行“ProcessAndSignal”方法
- 工作线程有足够的时间到信号标志并启动ProcessMessages方法的执行
- 主线程重新生成并设置将导致ProcessAndSignal方法优雅地完成的属性
可以发生以下情况吗?
1)ProcessAndSignal()将开始执行主线程设置的AutoResetEvent到了WaitOne(),这将导致死锁(在processor.ProcessMessages(前)将进入不定式环路)