gpt4 book ai didi

c++ - 有没有一种可靠的方法可以强制线程在 C++ 中停止? (尤其是独立的)

转载 作者:太空狗 更新时间:2023-10-29 20:10:46 25 4
gpt4 key购买 nike

我最近在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com