2015-11-05 61 views
0

假设我的类在其构造函数中运行了一个线程,执行后台处理,并且想要在析构函数中终止该线程。如何处理可能在请求时不终止的线程?

我们通常会设置一些标记,以便线程主要知道它应该退出,然后调用thread::join。但如果线程忙于做一些长时间的操作 - 甚至卡住(假设它被阻塞在等待什么) - join从来没有返回?

有没有办法给一个超时参数传递给join并没有terminate方法上std::thread我可以看到(http://en.cppreference.com/w/cpp/thread/thread

我知道,在一个精心设计的程序,这不应该允许这种情况发生,但。 ..

+3

我相信自定义是使用[future](http://en.cppreference.com/w/cpp/thread/future)并等待指定的时间,然后再决定连接失败并设置一个标志所以程序的其余部分都知道。 [This discussion](http://stackoverflow.com/questions/11223119/is-it-a-good-idea-to-shut-down-a-classs-thread-member-in-the-classs-destructor)may也对你感兴趣。 – jaggedSpire

+0

无论谁想要终止它,线程都应该干净地退出。我认为这样做的好方法是以某种方式让线程接收抛出异常并让线程捕获它,但我不记得最通用的方法来做到这一点。无论如何,既然你也是线程的编写者,你可以让代码在线程本身而不是调用者中处理卡住/太长的情况,并返回一个错误状态。或者像jaggedSpire建议的那样,使用“future”。 –

+0

@jaggedSpire这是一个有趣的讨论,虽然它看起来 - 经过很多思考 - 做我的建议。似乎没有处理“连接”挂起的情况。看起来很奇怪'线程'虽然没有办法被杀死。 –

回答

1

有没有标准的设施来强制杀死一个线程。选项有:

  • detach并让它永远运行(直到程序退出)。
  • 使用thread::native_handle()成员获取底层句柄。然后使用你的平台库(pthread,或WinAPI或其他)来杀死线程。

至于如何检测这样的情况,你可以使用,例如,二atomic<bool>变量,stopfinished。设置第一个,你会指示线程停止。线程会定期检查这个变量,如果设置,将停止其活动,然后设置finished并退出。您的主程序将等待一段时间(可能在循环中)设置finished,如果是,请致电join。如果不是,(表示线程没有响应),请使用上述两个解决方案之一。

相关问题