我编写了一个简单的作业队列,它使用一个线程逐个运行队列中的作业。线程本身来自池,因此只要作业队列对象存在,它的生命周期就会持续。作业从队列中弹出,然后在作业上调用run(),然后在完成后将其丢弃。
我想知道我可以使用什么样的范例来中止流程中的工作。天真的方法是有一个中止标志,我定期检查。问题是由于I / O阻塞或其他一些计算繁重的任务,一些工作需要一段时间。
我认为另一种选择是完全杀死线程。这是一个可能很脏且容易出错的解决方案。
还有其他方法吗?
编辑:因为我在C ++领域,有没有办法将异常注入另一个线程?它会立即中断执行并返回主线程。我认为这是理想的。答案 0 :(得分:0)
取决于您使用的线程的实现,可能有不同的方法来操纵“中止标志”。我会提出看看boost.threads& boost.interruption_points。 UPD:在线程中注入异常,如果它在interruption_point,就像你想要的那样。
但是,如果你有大量不可分割的繁重计算块,那么,我相信,从意识形态来说,它必须完整。想想,如果你看到任何可以阻止它的“时刻”,在这个区块内,那么你可以将这个区块拆分成部分,在那些时刻插入“中止标志”。 所以,如果它是整体块,就不会有这样的时刻。所以你不能正常中断计算。所以你必须等待他们的完成。
但是你可以避免等待问题,如果你计算你的重块不是在分离的线程中,而是在分离的过程中。然后你就可以杀死它,而不用担心会破坏你的主进程内存,如果需要的话,你甚至可以在几分钟前关闭主进程后,让它计算出需要几个小时的内容,然后在需要的时候静静地死掉。没问题。