メッセージポンプに似たものを作成する必要がある小さな演習を行っています。私が持っているのは、実行する作業のキューです。すべてのスレッドが実行するキューに作業を追加できる一方で、作業を完全に 1 つのスレッドで実行したいと考えています。
Queue<WorkToDo> queue;
スレッドは待機ハンドルを使用して、実行する作業があることをポンプに伝えます。
WaitHandle signal;
ポンプは、やるべき仕事がある限りループし、信号が再開するのを待ちます。
while(ApplicationIsRunning){
while(queue.HasWork){
DoWork(queue.NextWorkItem)
}
signal.Reset();
signal.WaitOne();
}
他のすべてのスレッドは、キューに作業を追加し、待機ハンドルを通知できます...
public void AddWork(WorkToDo work){
queue.Add(work);
signal.Set();
}
問題は、作業が十分に速く追加されている場合、作業のキュー チェックと WaitHandle のリセットの間に、別のスレッドが作業をキューに追加できるため、作業がキューに残される状況が発生する可能性があることです。
WaitHandle の周りにコストのかかるミューテックスを配置せずに、その状況を緩和するにはどうすればよいでしょうか?