在另一个线程执行非静态成员函数DisplayWriters报错,求解决方案
解决非静态成员函数作为线程函数的问题
你遇到的这个错误,本质是因为非静态成员函数默认需要接收一个this指针作为隐含参数,而std::thread的构造函数无法自动帮你绑定这个指针。既然DisplayWriters需要访问类的非静态成员writers,不能改成静态函数,那可以用下面几种方法解决:
方法一:使用Lambda表达式(最推荐)
Lambda可以轻松捕获当前对象的this指针,让成员函数能正确访问类内成员:
void Chat::Init() { // some code std::thread writersThread([this] { DisplayWriters(); // lambda里会自动用当前对象的this指针 }); // 记得根据需求调用 join() 或者 detach(),避免线程悬空 writersThread.join(); // 等待线程完成再继续执行后续代码 }
这种写法清晰直观,也是C++11及以后最常用的方式。
方法二:使用std::bind绑定this指针
借助<functional>头文件里的std::bind,把this指针绑定到成员函数的隐含参数上:
#include <functional> void Chat::Init() { // some code std::thread writersThread(std::bind(&Chat::DisplayWriters, this)); writersThread.join(); }
std::bind会生成一个可调用对象,把this作为第一个参数传递给DisplayWriters,这样线程就能正确调用成员函数了。
关键注意事项
- 务必保证
Chat对象的生命周期长于线程的运行周期!如果线程还在执行DisplayWriters的时候,Chat对象被销毁了,访问writers会导致未定义行为(比如程序崩溃)。 - 不要忘记处理线程的归属:如果需要等待线程执行完毕,调用
join();如果想让线程后台运行,可调用detach(),但要注意悬空指针/引用的风险。
内容的提问来源于stack exchange,提问作者David Konn
相关产品推荐
相关产品推荐

