【问题标题】:Interrupt thread after amount of time, without blocking while waiting一段时间后中断线程,等待时不阻塞
【发布时间】:2011-11-20 20:45:35
【问题描述】:

我想在后台启动一个线程,如果它没有完成,我想在一定时间后停止它。主要问题是,在等待线程完成或计时器到达最后期限时,程序不应阻塞。保证这一点很重要。

我尝试了this example,但在等待timed_join 时,它阻塞了。我必须宣布一个警告,有一些计算正在进行中。

void CallbackReceived() {
  boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(500);
  boost::thread thrd(&Foo);

  if (thrd.timed_join(timeout)) {
    //finished
  } else {
    //Not finished;
  }
}

你有什么建议吗?

【问题讨论】:

  • 离开我的头顶,'宣布警告,等待完成之前','让另一个后台线程负责监视第一个','更改第一个线程,以便它知道时间限制,可以自行中止..'
  • 启动另一个调用timed_join的线程。
  • @forsvarir 我会回答这个问题。

标签: c++ multithreading boost-thread


【解决方案1】:

必须停止的线程可以在一定时间后自行退出。

例如,如果它在一个循环中执行所有工作,它可以定期检查(例如,循环的每 10 次迭代)是否已超过最大时间量,并在时间已过的情况下退出。

主线程会不时检查完成工作(或提前终止)的线程并将其删除。

【讨论】:

    【解决方案2】:

    您可以启动一个线程,该线程将启动您的线程并等待 timed_join。

    main
    |
    |---thread
    |      |
    |      |-----thread
    |               |
    |               |
    |               |
    |     join<------     
    |
    |
    

    但是,如果您只是想要一个警告,请在启动线程之前放置它。如果它是一个图形应用程序并且您仍想处理事件,则您必须使您的主线程可用,如上所示。

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多