2014-05-01 126 views
0

我写了一个简单的作业队列,它使用一个线程逐个运行队列中的作业。线程本身来自池,所以只要作业队列对象在其周围,它的生命周期就会持续。作业从队列中弹出,然后在作业上调用run(),并在完成后放弃。在线程上处理作业取消的最佳方法

我想知道什么样的范例可以用来在中途中止工作。天真的做法是定期检查一个中止标志。问题是由于I/O阻塞或其他一些计算繁重的任务,一些工作需要一段时间。

我认为的另一个选择是完全杀死线程。这是一个潜在的肮脏和错误的解决方案。

还有其他的方法吗?

编辑:由于我在C++土地,有没有办法注入异常到另一个线程?它会立即中断执行并返回到主线程。我认为这将是理想的。

+0

如果你真的没有看到使用“* flag”* - 类似上面提到的任何可能性,请查看'pthread_cancel()'。 – alk

+0

或者只是使用标志解决方案,或者运行一个可以杀死的单独进程。杀死一个线程是一个糟糕的主意。请参阅http://www.drdobbs.com/parallel/interrupt-politely/207100682 –

+0

@alk:AFAIK,使用'pthread_cancel()'也会导致线程本身退出。我试图避免这一点。基本上,我想要一种方法来取消正在运行的作业,以便可以使用干净的作业队列。一种方法是重新创建线程。 – MarkP

回答

0

取决于您使用的线程的实现,可能有不同的方式来操纵“中止标志”。我会提供看向boost.threads & boost.interruption_points。 UPD:在线程中注入异常(如果它位于interruption_point中),如您所愿。但是,如果你有很大的不可分割的大量计算块,那么,我相信,在思想上它必须完成。想一想,如果你看到任何可以阻止它的“时刻”,在这个区块内部,那么你可以将这个区块分成几部分,在那里插入“中止标志”。 所以,如果是单块,就不可能有这样的时刻。所以你不能中断计算正常的方式。所以你必须等待他们的完成。

但是你可以避免等待问题,如果你将计算你的重块不是分开的线程,而是分开的过程。然后你可以杀死它,而不用担心弄脏你的主进程内存,如果需要的话,你甚至可以让它在几分钟前关闭你的主进程之后计算它需要几个小时的时间,然后静静地死掉,如果需要的话。没问题。

相关问题