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

C++实现线程工厂模式时isFinished标识无法终止工作线程问题求助

问题核心原因

你在头文件中用static修饰了全局变量isFinished,这是导致问题的根本原因:

  • C++中,头文件内定义的static全局变量,会在每一个引入该头文件的编译单元(也就是你这里的main.cpp、sender.cpp)分别生成一份独立的实例
  • 你在main函数中修改的是main.cpp编译单元内的isFinished,而sender.cpp中工作线程读取的是属于sender.cpp编译单元的另一个isFinished,后者永远为初始默认值false,所以循环永远不会退出,join()操作就会一直阻塞。

修复方案

只需要调整isFinished的定义方式即可,有两种常用实现:

方案1:将全局变量改为跨编译单元共享实现

  1. 把sender.h里的static std::atomic<bool> isFinished;改成声明,加extern关键字:
// sender.h修改对应行为
extern std::atomic<bool> isFinished;
  1. 在任意一个cpp文件(比如sender.cpp)中添加变量的定义:
// sender.cpp开头新增行
std::atomic<bool> isFinished;

这样所有编译单元引用的都是同一个isFinished实例,main中修改后工作线程能正常读到变化退出循环。

方案2:避免用全局变量,把停止标志作为Sender类的成员

这种设计更符合面向对象封装原则,也更适合你要做的工厂模式后续扩展:

// 修改后的sender.h
#include <iostream>
#include <thread>
#include <atomic> 

class Sender {
public:
    std::atomic<bool> isFinished{false}; // 作为类成员
    std::thread worker;

    Sender()
        : worker(&Sender::SenderWorkflow, this)
    {
    }

    void SenderWorkflow();

    void join() {
        worker.join();
    }

    // 封装停止方法,使用更安全
    void stop() {
        isFinished = true;
    }
};

对应的main函数调整为:

int main()
{
    Sender mSender;
    std::cin.get();
    mSender.stop(); // 调用类方法停止对应线程
    mSender.join();
}

sender.cpp的循环直接读取类内的成员即可:

void Sender::SenderWorkflow()
{
    while (!isFinished)
    {
        std::cout << "Working... \n";
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:54:03