单例线程类中正确调用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
相关产品推荐
相关产品推荐

