我最近在 C++11 中使用线程。现在我正在考虑如何强制停止线程。我在stackoverflow上找不到它,也试过这些。
我没有更多的想法。我听说过 WinAPI,但我想要一个可移植的解决方案。 (这也意味着我不会使用 fork())
你能给我一个解决方案吗?我真的很想做。
最佳答案
在 C++ 中强制关闭线程的最大问题之一是违反 RAII。
当一个函数(以及随后的线程)优雅地完成时,它所拥有的一切都会被函数/线程创建的对象的析构函数优雅地清理掉。
内存被释放,
操作系统资源(句柄、文件描述符等)被关闭并返回给操作系统
锁正在解锁,以便其他线程可以使用它们保护的共享资源。
执行其他重要任务(例如更新计数器、日志记录等)。
如果你粗暴地杀死一个线程(例如,在 Windows 上被 TerminateThread
杀死),这些都不会发生,并且程序会处于非常危险的状态。
可以使用的(不那么)常见模式是注册一个“取消 token ”,如果其他线程提出要求(la TPL/PPL),您可以在该 token 上监视并正常关闭线程。就像是
auto cancellationToken = std::make_shared<std::atomic_bool>();
cancellationToken->store(false);
class ThreadTerminator : public std::exception{/*...*/};
std::thread thread([cancellationToken]{
try{
//... do things
if (cancellationToken->load()){
//somone asked the thred to close
throw ThreadTerminator ();
}
//do other things...
if (cancellationToken->load()){
//somone asked the thred to close
throw ThreadTerminator ();
}
//...
}catch(ThreadTerminator){
return;
}
});
通常,甚至不会为一个小任务打开一个新线程,最好将多线程应用程序视为并发任务和并行算法的集合。一个人为一些长期正在进行的后台任务打开一个新线程,这些任务通常在某种循环中执行(例如,接受传入的连接)。
所以,无论如何,要求取消一个小任务的情况反正很少见。
域名:
不。