言語固有ではありませんが、C# には次のようなものがあります。
public static void StartJob() {
ThreadPool.QueueUserWorkItem(s => {
if (Monitor.TryEnter(_lock)) {
ProcessRows();
Monitor.Exit(_lock);
}
}
);
ProcessRows()
すべての行が削除されるまで、データベース内の行を処理して削除します。プログラムの起動時、およびプログラムの他の場所で行がデータベースに追加されるたびに、StartJob
が呼び出され、プログラムをブロックすることなくすべての行が処理されるようにします。現在、ロックを解放しようとしているのとまったく同時に行が追加された場合、その行はStartJob
処理されません。
すべての行が確実に処理されるようにするにはどうすればよいですか? ProcessRows()
行が追加されない限り、実行しないことを好みます。