- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我最近在使用 C++11 中的线程。现在我正在考虑如何强制停止线程。我在 stackoverflow 上找不到它,也尝试了这些。
我没有更多的想法。我听说过 WinAPI,但我想要一个可移植的解决方案。 (这也意味着我不会使用 fork())
你能给我一个解决方案吗?我真的很想做。
最佳答案
在 C++ 中强制关闭线程的最大问题之一是违反 RAII。
当一个函数(以及随后的线程)优雅地结束时,它持有的所有内容都会被函数/线程创建的对象的析构函数优雅地清除。
内存被释放,
操作系统资源(句柄、文件描述符等)被关闭并返回给操作系统
锁定被解锁,以便其他线程可以使用它们保护的共享资源。
执行其他重要任务(例如更新计数器、日志记录等)。
如果您粗暴地终止线程(例如,在 Windows 上通过 TerminateThread
),这些都不会发生,并且程序将处于非常危险的状态。
可以使用的(不太)通用模式是注册一个“取消 token ”,您可以在该 token 上监视并在其他线程要求时优雅地关闭线程(la TPL/PPL)。像
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;
}
});
通常,一个小任务甚至不会打开一个新线程,最好将多线程应用程序视为并发任务和并行算法的集合。一个人为一些长时间进行的后台任务打开一个新线程,这些任务通常在某种循环中执行(例如,接受传入连接)。
所以,无论如何,要求取消一个小任务的情况是很少见的。
长话短说:
Is there a reliable way to force a thread to stop in C++?
没有。
关于c++ - 有没有一种可靠的方法可以强制线程在 C++ 中停止? (尤其是独立的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37281411/
我是一名优秀的程序员,十分优秀!