加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

是否有一种可靠的方法来强制线程在C中停止? (特别是独立的)

发布时间:2020-12-16 10:02:45 所属栏目:百科 来源:网络整理
导读:我最近在C 11中使用线程.现在我正在考虑如何强制停止线程.我无法在stackoverflow上找到它,也试过这些. 每个线程一个变量:不太可靠 在主线程中返回:我必须强制退出只有一个而不是全部 我没有更多的想法.我听说过WinAPI,但我想要一个便携式解决方案. (这也意
我最近在C 11中使用线程.现在我正在考虑如何强制停止线程.我无法在stackoverflow上找到它,也试过这些.

>每个线程一个变量:不太可靠
>在主线程中返回:我必须强制退出只有一个而不是全部

我没有更多的想法.我听说过WinAPI,但我想要一个便携式解决方案. (这也意味着我不会使用fork())

你能帮我解决一个问题吗?我真的很想这样做.

解决方法

在C中强制关闭线程的最大问题之一是RAII违规.

当一个函数(以及随后的一个线程)正常完成时,它所持有的一切都由函数/线程创建的对象的析构函数优雅地清理.

内存被释放,
操作系统资源(句柄,文件描述符等)将关闭并返回给操作系统
锁正在解锁,因此其他线程可以使用它们保护的共享资源.
执行其他重要任务(例如更新计数器,记录等).

如果你粗暴地杀死一个线程(例如,在Windows上通过TerminateThread),实际上不会发生这些,并且程序处于非常危险的状态.

可以使用的一个(不那么)常见模式是注册一个“取消令牌”,如果其他线程要求,您可以监视并正常关闭该线程(一个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;
  }

});

通常,人们甚至不为一个小任务打开一个新线程,最好将多线程应用程序视为并发任务和并行算法的集合.一个为一些长期持续的后台任务打开一个新线程,通常在某种循环中执行(例如,接受传入的连接).

所以,无论如何,要求取消小任务的案例很少见.

tldr:

Is there a reliable way to force a thread to stop in C++?

没有.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读