【问题标题】:Terminating pthreads [duplicate]终止 pthreads [重复]
【发布时间】:2014-12-23 16:08:35
【问题描述】:

可以使用pthread_join() 停止线程。但是让我们想象一下,一个人有许多线程执行一项复杂的任务,并且可能不会同时停止。其中一个可能会更早停止(因为它得到了所需的结果)。但是如何停止其他几乎无限的线程呢?如果一个线程找到了正确的解决方案,就没有剩下的了,所以其他线程永远不会成功。

当其中一个线程得到结果并停止时,如何终止所有线程?

【问题讨论】:

  • 我相信这是复制品,但还不足以挥舞强大的锤子:stackoverflow.com/q/12029180/10077
  • pthread_join() 不会停止线程——它会一直等到线程自行停止,然后获取返回值和其他相关的数据结构。如果您需要一种方法来对线程进行有序关闭,请阅读pthread_cancel() 和相关例程。为了强行杀死正在运行的线程,您需要了解信号处理,例如pthread_exit().

标签: c++ c multithreading pthreads


【解决方案1】:

随心所欲。可能最简单的方法是让一个布尔变量受互斥锁保护,该互斥锁在找到解决方案并定期检查时设置。如果一个线程找到了变量集,这意味着其他线程找到了解决方案,它应该终止。

您的问题表明您正在错误地考虑线程。您无需“进入”线程即可使其终止或做正确的事情。您必须编写代码,以便线程首先做正确的事情,只做需要完成的工作,并在它们无事可做时终止。这样,您就不需要通过一些额外的机制强迫他们做正确的事情。

另外,澄清一下,pthread_join 不会停止线程。它只是等待一个线程终止并在它之后进行清理。

【讨论】:

  • 关于pthread_join() 我的意思是如果不使用程序将终止但线程将继续存在。我希望我的线程进行困难的计算。事实上,哈希。如果一个线程刚刚生成了 needed 散列,则所有线程都必须停止。如果不是所有这些都继续工作。
  • @ForceBru 如果您终止一个程序,该程序的所有线程将立即停止执行,即使它们尚未退出。
  • pthread_cancel 和 pthread_kill 可用于终止线程。
  • @jimmcnamara 是的。如果这些功能恰好符合您的要求,您可以使用它们。但是它们有点难以理解和安全使用,所以我一般不推荐它们。
猜你喜欢
  • 1970-01-01
  • 2014-08-04
  • 2016-10-01
  • 2014-03-05
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
相关资源
最近更新 更多