0
假设我的类在其构造函数中运行了一个线程,执行后台处理,并且想要在析构函数中终止该线程。如何处理可能在请求时不终止的线程?
我们通常会设置一些标记,以便线程主要知道它应该退出,然后调用thread::join
。但如果线程忙于做一些长时间的操作 - 甚至卡住(假设它被阻塞在等待什么) - join
将从来没有返回?
有没有办法给一个超时参数传递给join
并没有terminate
方法上std::thread
我可以看到(http://en.cppreference.com/w/cpp/thread/thread)
我知道,在一个精心设计的程序,这不应该允许这种情况发生,但。 ..
我相信自定义是使用[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
无论谁想要终止它,线程都应该干净地退出。我认为这样做的好方法是以某种方式让线程接收抛出异常并让线程捕获它,但我不记得最通用的方法来做到这一点。无论如何,既然你也是线程的编写者,你可以让代码在线程本身而不是调用者中处理卡住/太长的情况,并返回一个错误状态。或者像jaggedSpire建议的那样,使用“future”。 –
@jaggedSpire这是一个有趣的讨论,虽然它看起来 - 经过很多思考 - 做我的建议。似乎没有处理“连接”挂起的情况。看起来很奇怪'线程'虽然没有办法被杀死。 –