不是真的特定語言,但我有在C#:如何確保線程任務運行
public static void StartJob() {
ThreadPool.QueueUserWorkItem(s => {
if (Monitor.TryEnter(_lock)) {
ProcessRows();
Monitor.Exit(_lock);
}
}
);
ProcessRows()
過程,直到所有行被刪除數據庫中刪除行。在程序啓動時,只要將一行添加到程序中其他位置的數據庫中,就調用StartJob
,以確保處理所有行而不會阻塞程序。現在如果在StartJob
即將釋放鎖的同一時間添加一行,將不會處理該行。
如何確保處理所有行?除非添加行,否則我寧願不運行ProcessRows()
。
您需要將行添加到數據庫中,以通知程序說它可以開始處理。你可以使用一些全球互斥體。 –
「現在,如果在StartJob即將釋放鎖的同一時間添加一行,將不會處理它。」 - 你確定?這件事發生在你身上嗎? –
@DanielHilgarth:這是不太可能的,但是這裏存在一個理論上的競爭條件,因爲'ProcessRows'在鎖被釋放之前完成;即使'ProcessRows'沒有運行,第二個線程也可能會失敗'.TryEnter'。 –