【问题标题】:Why thread has an unstable behaviour?为什么线程的行为不稳定?
【发布时间】:2015-10-22 21:34:04
【问题描述】:

我在一段时间内有一个线程,但该程序仅在某些情况下有效。 我正在使用 c++、Boost 1.59 和 Visual Studio 2012 进行编程。 代码如下:

while(condition){
      boost::thread t(GeneticAlgorithm);
          if(!t.timed_join(boost::posix_time::seconds(10))){
             //always entry here, because geneticAlgoritm is infinity 
             TerminateThread(t.native_handle(), 0);
             more calculus..
          }
}

我希望在 10 秒后停止线程并在返回“while”时创建另一个线程。我第一次运行线程工作,此后有时工作有时不工作。有什么想法吗?

【问题讨论】:

  • TerminateThread 几乎从来都不是正确的方法。理想情况下,你应该有办法打断GeneticAlgorithm
  • 我见过的所有消息来源都说“不要依赖终止线程;它总是会导致程序状态不确定”
  • ^^ 将任务排队到线程池,很好,应用程序生命周期线程正常,持续创建/加入/终止超级吸。
  • 如果你真的需要停止并重新启动,在线程实例中设置一些 'stopWhenYouCanAndDeleteYourself' 布尔值,将线程的优先级设置为尽可能低的并孤立线程实例。
  • 我们可以看看遗传算法中你有中断点的部分吗?

标签: c++ multithreading boost


【解决方案1】:

没有interruptpoints 没有中断。这里的中断不是软中断或硬件中断,而是协同中断。

您需要添加一个中断点,以便激活协作中断。

可以通过调用 interrupt() 成员来中断正在运行的线程 对应的 boost::thread 对象的函数。当。。。的时候 被中断的线程接下来执行指定的中断之一 点(或者如果它当前在执行一个时被阻止) 启用中断,然后会出现 boost::thread_interrupted 异常 在被中断的线程中抛出。如果不被抓住,这将导致 被中断的线程的执行终止。与任何 其他异常,堆栈将被展开,并且析构函数 自动存储期限的对象将被执行。

您可以通过这种方式添加中断点。

bool GeneticAlgorithm() {
    ... some code
    // this point must be passed at least once every 10 sec.
    boost::this_thread::interruption_point(); 
    ... more code
}

【讨论】:

  • 不知道为什么这赢得了反对票。当然,这个问题的唯一答案是“不要那样做”。但至少这是提供替代方案的尝试。
  • 其实我是想说“你需要添加一个中断点”,我最好在答案中写出来。
  • 这是我从中读到的,但使用更大的锤子将点击回家很少受伤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 2022-07-10
  • 2012-01-08
  • 2013-10-20
  • 2011-10-12
  • 1970-01-01
  • 2015-05-05
相关资源
最近更新 更多