在一定时间后中断线程,在等待时不阻塞

Interrupt thread after amount of time, without blocking while waiting

本文关键字:在等待 线程 定时间 中断      更新时间:2023-10-16

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

我尝试了这个例子,但是在等待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;
  }
}

你有什么建议吗?

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

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

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

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

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

主线程可以不时地检查完成任务(或过早终止)的线程并删除它们。