【发布时间】:2014-05-01 17:53:49
【问题描述】:
我写了一个简单的作业队列,它使用一个线程一个接一个地运行队列中的作业。线程本身来自池,因此只要作业队列对象存在,它的生命周期就会持续。作业从队列中弹出,然后在作业上调用 run(),然后在完成后将其丢弃。
我想知道我可以使用什么样的范例来中止工作。天真的方法是有一个我定期检查的中止标志。问题是由于 I/O 阻塞或其他一些计算量大的任务,一些作业需要一段时间。
我认为的另一个选择是完全终止线程。这是一个潜在的肮脏和容易出错的解决方案。
还有其他方法吗?
编辑:由于我在 C++ 领域,有没有办法将异常注入另一个线程?它会立即中断执行并返回主线程。我认为这将是理想的。
【问题讨论】:
-
如果您真的看不到使用上述“flag”-à 方法的任何可能性,请查看
pthread_cancel()。 -
要么使用标志解决方案,要么运行一个可以终止的单独进程。杀死一个线程是一个坏主意。见drdobbs.com/parallel/interrupt-politely/207100682
-
@alk: AFAIK,使用
pthread_cancel()也会导致线程本身退出。我试图避免这种情况。基本上,我想要一种取消正在运行的作业的方法,以便可以使用干净的作业队列。一种方法是重新创建线程。 -
请问“立即中断执行”(来自您的编辑)和“导致线程本身退出”(来自您的评论)?
-
@alk:即使在调用
clean()之后,作业队列对象仍应像作业队列一样工作,其中作业被中止并且队列被清空。中断执行会中止作业,但让线程继续运行(阻塞并等待新作业)。只有当作业队列对象被销毁时才会退出线程。我也愿意接受有关此设计的建议。