我最近在 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;
      }
    
    });
    

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

    所以,无论如何,要求取消一个小任务的情况反正很少见。

    域名:



    不。

    10-07 13:26
    查看更多