不是真的特定语言,但我有在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'。 –