问:类的成员函数可以传入线程参数吗?
回答:
如果c语言的全局函数,可以。
如果是类的静态成员函数,可以
如果是类的普通成员函数,不可以
为什么?
《深入探索C++对象模型》中提到成员函数时,当成员函数不是静态的,虚函数,那么我们有以下结论: (1) &类名::函数名 获取的是成员函数的实际地址; (2) 对于函数x来讲obj.x()编译器转化后表现为x(&obj),&obj作为this指针传入; (3) 无法通过强制类型转换在类成员函数指针与其外形几乎一样的普通函数指针之间进行有效的转换。所以,要在回调函数中传入一个类的普通成员函数时,this指针无处安放使得回调函数比较复杂。
怎么解决?
对成员函数进行强制转换,当作回调函数
class MyClass { pthread_t TID; void func() { //子线程执行代码 } public: bool startThread() {//启动子线程 typedef void* (*FUNC)(void*);//定义FUNC类型是一个指向函数的指针,该函数参数为void*,返回值为void* FUNC callback = (FUNC)&MyClass::func;//强制转换func()的类型 int ret = pthread_create( &TID , NULL , callback , this ); if( ret != 0 ) return false; else return true; } }; int main() { MyClass a; a.startThread(); }
回调函数为普通函数,但在函数体内执行成员函数