2009-05-25 66 views
4

我有几个线程池,我希望我的应用程序处理取消操作。C++实现跨线程池取消

为此,我实现了一个共享操作控制器对象,该对象在每个被调用的线程池worker函数的各个位置进行轮询。

这是一个很好的模型,还是有更好的方法来做到这一点?

我只是担心所有这些operationController.checkState()散布在整个代码。

回答

4

是的,这是一个很好的办法。 Herb Sutter有一个nice article比较它与替代品(这是更糟糕的)。

1

有了任何类型的ansynchronous取消,你将不得不定期轮询某种标志。有一个根本性的问题是不得不把事情保持在一个合理的状态。如果你只是在任何事情的中间杀死一个线程,坏事迟早会发生。

根据你实际在做什么,你可能会忽略操作的结果而不是取消它。您让操作继续,但不要等待它完成,并且不要检查结果。

如果您确实需要停止操作,那么您将不得不在适当的位置进行轮询,并执行任何需要清理的操作。

1

这是一个很好的方法。

另一种可能的方式是,如果有其他子程序[s]线程调用无论如何,检查该子程序并抛出一个异常(被捕获在线程的顶部),假设“取消”可能被认为是例外,并且假设线程正在执行的代码是异常安全的。

1

我不会那样做,检查共享对象。

我很可能会为每个线程对象提供一种取消自己线程内执行的方式,无论是事件,线程安全状态变量还是其他。

共享操作控制器的问题在于,从我的角度来看,逻辑是相反的,为什么当它不控制任何东西时将其称为“控制器”?

对我来说,操作控制器应该取消取消命令,然后依次选择合适的线程并发信号停止。如果你知道我的意思,那将是一个正确的“指挥链”。你做这件事的方式是在不遵守命令停止的线程中引入一种不自然的行为,而如果每次都检查他的“上级”是否“写了一些命令”。不知何故,它感觉不对。

另外,如果你只是一个“一些”线程在未来停止?如果你想包含一些先进的逻辑,以便线程只会停止给定条件会怎么样?那么你将不得不重写每一个线程中的代码来处理这种情况。

所以我会提供一种方法,让每个线程能够处理它们的信号,例如通过使用带有FIFO结构的Command Pattern。 (顺便说一句,我意识到他们是线程池工作者,而不是实际的线程类,但仍然是,我认为每个工人必须分别停止,而不是相反)。

0

在类似情况下,我使用了一个事件,非自动重置,所有线程都可以查看该事件。与轮询非常相似,只是如果你的线程有时会阻塞,他们也可以为“停止”事件睡觉。 (更容易在Windows上。)

/L