前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日一问:c++类的成员函数,能作为线程的参数吗?

每日一问:c++类的成员函数,能作为线程的参数吗?

作者头像
程序员小王
发布2020-11-09 14:38:54
2.2K0
发布2020-11-09 14:38:54
举报
文章被收录于专栏:架构说

问:类的成员函数可以传入线程参数吗?

回答:

如果c语言的全局函数,可以。

如果是类的静态成员函数,可以

如果是类的普通成员函数,不可以

为什么?

代码语言:javascript
复制
《深入探索C++对象模型》中提到成员函数时,当成员函数不是静态的,虚函数,那么我们有以下结论: 
 (1) &类名::函数名 获取的是成员函数的实际地址;

 (2) 对于函数x来讲obj.x()编译器转化后表现为x(&obj),&obj作为this指针传入; 
 (3) 无法通过强制类型转换在类成员函数指针与其外形几乎一样的普通函数指针之间进行有效的转换。

所以,要在回调函数中传入一个类的普通成员函数时,this指针无处安放使得回调函数比较复杂。

怎么解决?

对成员函数进行强制转换,当作回调函数

代码语言:javascript
复制
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();  
}

回调函数为普通函数,但在函数体内执行成员函数

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Offer多多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档