You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单例线程类中正确调用join(),解决程序异常终止问题

问题解决:程序退出时未停止线程导致的异常终止

当前程序在启动线程后直接关闭时触发异常,核心原因是**std::thread对象在析构时如果处于joinable状态(即未调用join()或detach()),会自动调用std::terminate()终止程序**。你的TTestThread析构函数为空,当程序退出销毁单例对象时,若线程还在运行(未调用stop()),_testThread的析构就会触发这个逻辑。


1. 在析构函数中自动停止线程

修改TTestThread的析构函数,调用已有的stop()方法,确保对象销毁时线程被正确停止并等待结束:

TTestThread::~TTestThread()
{
    stop();
}

这样无论用户是否手动点击停止按钮,程序退出时单例对象销毁,都会自动执行stop()流程:设置_runned为false,等待线程退出循环,然后join线程,避免_testThread处于joinable状态析构。

2. 修复start()方法的线程重复启动问题

当前start()方法没有判断线程是否已经在运行,若用户多次点击启动按钮,会直接覆盖_testThread对象,旧线程的std::thread析构时同样会触发异常。可以在start()中增加判断:

void TTestThread::start()
{
    // 如果线程已经在运行,直接返回
    if (_runned.load(std::memory_order_acquire) || _testThread.joinable()) {
        return;
    }
    _runned.store(true, std::memory_order_release);
    _testThread = std::thread([this]() { run(); });
}

补充说明

  • 使用std::memory_order指定内存序是为了确保多线程下的原子操作可见性,避免指令重排导致的逻辑错误。
  • 线程的run()方法中使用10ms的sleep,能保证_runned的状态变更会被及时读取到,线程能快速响应停止信号。

内容的提问来源于stack exchange,提问作者Toff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:43:16