MyCollege1999 2024-04-01 16:39 采纳率: 73.3%
浏览 3
已结题

linux c++类的成员函数里创建一个线程,线程处理函数是成员函数B,可行吗?

linux c++类的成员函数里创建一个线程,线程处理函数是成员函数B,可行吗?

.h:
class  Exa
{
public:
     int funcA();
     void* funcB();
}

.cpp:

funcA()
{
  pthread_t thread;
   int ret = pthread_create(&thread, NULL, funcB, NULL);
   ......//省略 
}

现在编译出错
error:cannot convert 'Exa::funcB' from type 'void * (Exa::)() to type 'void * ()(void)'
因为我无法使用静态的函数,因为funcB里要访问非静态的成员、非静态的函数。
请指点下解决思路?

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-04-01 16:39
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题原因是pthread_create函数第三个参数需要传入一个静态的函数。解决方法是将Exa类的成员函数funcB定义为静态的,并在实现时手动传入this指针作为参数。代码示例如下: .h文件:
    class Exa{
    public:
        int funcA();
        static void* funcB(void* arg);
    };
    

    .cpp文件:

    int Exa::funcA(){
        pthread_t thread;
        int ret = pthread_create(&thread, NULL, Exa::funcB, this);
        //省略
    }
    void* Exa::funcB(void* arg){
        Exa* instance = static_cast<Exa*>(arg);
        //使用instance即可访问Exa类的非静态成员
        //省略
    }
    

    注意,在调用pthread_create时,传入的第三个参数应该为Exa::funcB,而不是this->funcB。这是因为funcB在定义时已被声明为静态函数,使用类名限定符即可访问。 同时,在funcB内部,需要手动将参数转换为Exa*类型的指针,这样才能访问非静态成员。 最后,需要注意的是,线程处理函数必须是静态函数,而且在调用时需要手动传入this指针作为参数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月10日
  • 已采纳回答 4月2日
  • 创建了问题 4月1日

悬赏问题

  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆
  • ¥15 arbotix没有/cmd_vel话题
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀
  • ¥50 我在一个购物网站的排队系统排队,这个排队到号后重新定向到目标网站进行购物,但是有技术牛通过技术方法直接跳过排队系统进入目标网址购物,有没有什么软件或者脚本可以用
  • ¥15 ios可以实现ymodem-1k协议 1024字节传输吗?