C++实现线程工厂模式时isFinished标识无法终止工作线程问题求助
问题核心原因
你在头文件中用static修饰了全局变量isFinished,这是导致问题的根本原因:
- C++中,头文件内定义的
static全局变量,会在每一个引入该头文件的编译单元(也就是你这里的main.cpp、sender.cpp)分别生成一份独立的实例 - 你在main函数中修改的是main.cpp编译单元内的
isFinished,而sender.cpp中工作线程读取的是属于sender.cpp编译单元的另一个isFinished,后者永远为初始默认值false,所以循环永远不会退出,join()操作就会一直阻塞。
修复方案
只需要调整isFinished的定义方式即可,有两种常用实现:
方案1:将全局变量改为跨编译单元共享实现
- 把sender.h里的
static std::atomic<bool> isFinished;改成声明,加extern关键字:
// sender.h修改对应行为 extern std::atomic<bool> isFinished;
- 在任意一个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
相关产品推荐
相关产品推荐

