C++类内创建线程的旧实现疑问:为何采用静态入口函数?
为什么在C++类中创建线程需要静态入口函数?
你当时用静态入口函数启动线程,核心原因是早期线程API或旧版C++标准的限制:
- 非静态成员函数的特殊性:类的非静态成员函数会隐含一个
this指针作为第一个参数,而传统线程创建函数(比如POSIX的pthread_create)要求入口函数只能接受一个void*类型参数,无法直接适配带隐式this的非静态成员函数。 - 静态成员函数没有隐式
this指针,刚好符合线程入口函数的签名要求。你把当前对象的this指针传给静态函数,在静态函数里将void*转换回类指针,再调用非静态的线程任务函数,以此绕开限制,让线程能访问类的成员变量和方法。
在C++11及以后的标准里,已经不需要这种静态入口函数了,有更简洁的写法:
方案1:使用Lambda表达式捕获this
AClass::AClass(void) { _terminate_me = false; // 注意:原代码这里声明了局部变量,会导致线程判断的变量和析构函数修改的不是同一个,必须去掉前面的bool std::thread txrxthreadObj([this](){ AClassThread(); }); txrxthreadObj.detach(); }
方案2:使用std::bind绑定this指针
#include <functional> AClass::AClass(void) { _terminate_me = false; std::thread txrxthreadObj(std::bind(&AClass::AClassThread, this)); txrxthreadObj.detach(); }
另外要修正你原代码里的bug:构造函数里的bool _terminate_me = false;是创建了局部变量,并非给类的成员变量赋值,这会导致线程循环判断的变量和析构函数修改的变量不是同一个,线程永远无法收到终止信号,必须去掉前面的bool,直接给成员变量赋值。
内容的提问来源于stack exchange,提问作者Richard Klosinski
相关产品推荐
相关产品推荐

