C++使用线程函数pthread_create时,调用的成员函数要定义为静态成员函数

    今天在进行多线程编程的时候遇到了一个编译问题:error: argument of type ‘void (PIAMW::Communicator::)()’ does not match ‘void* (*)(void*)’
    后来发现将线程处理函数声明为static类型,问题得解。
    其实这个原因很简单,当把线程函数封装在类中,this指针会作为默认的参数被传进函数中,从而和线程函数参数(void*)不能匹配,不能通过编译。怎么解决呢?网上有一个解决办法,引用过来,自己记着。
    将线程函数作为静态函数,因为在C++中静态函数没有this指针(即在内存中静态函数和普通全局函数几乎没有什么区别),故可以匹配编译通过, 但是当线程函数要访问私有变量呢?可以访问到吗?答案是不可以!
    解决方案: 将this指针作为参数传递给静态函数,这样可以通过该this指针访问所有的私有变量, 但是我要是还需要向静态函数中传递我自己需要的参数呢?
    答案是:将this指针和需要的参数作为一个结构体一起传给静态函数,请看下面代码:
#include <iostream>
#include "pthread.h"
using namespace std;
class A;
struct ARG
{
     A* pThis;
     string var;
};
class A
{
    public:
        A();
        ~A();
        static void* thread(void* args);
        void  excute();
    private:
        int iCount;
};
A::A()
{
    iCount = 10;
}
A::~A()
{
}
void* A::thread(void* args)
{
     ARG *arg = (ARG*)args;
     A* pThis = arg->pThis;
     string var = arg->var;
     cout<<"传入进来的参数var: "<<var<<endl;
     cout<<"用static线程函数调用私有变量: "<<pThis->iCount<<endl;
}
void A::excute()
{
     int error;
     pthread_t thread_id;
     ARG *arg = new ARG();
     arg->pThis = this;
     arg->var = "abc";
     error = pthread_create(&thread_id, NULL, thread, (void*)arg);
     if (error == 0)
     {
         cout<<"线程创建成功"<<endl;
         pthread_join(thread_id, NULL);
     }
}
int main()
{
    A a;
    a.excute();
    return 0;
}


  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
引用提供了pthread_create函数的声明,它用于创建一个新的线程。其中,参数start_rtn是一个指向返回类型为void*,参数类型为void*的函数的指针。这意味着,要使用pthread_create函数,我们需要提供一个函数,满足这个参数类型的要求。 然而,引用指出,在C++中,当类中的成员函数调用类内的成员变量或成员函数,会隐式地调用this指针。这意味着,类成员函数实际上有一个额外的参数this指针,类型为指向该类的指针。所以,类成员函数与pthread_create函数需要的函数指针类型不匹配。 为了解决这个问题,可以使用一个静态成员函数作为线程函数,这样它就没有this指针,并且满足pthread_create函数的要求。然后,在静态成员函数内部,可以调用实际的类成员函数,并将this指针作为参数传递给它。这样,我们可以在静态成员函数内部访问类的成员变量和成员函数。 具体地,引用给出了一个示例代码,其中通过在类的静态成员函数调用实际的类成员函数使用pthread_create函数。在这个示例中,将this指针作为参数传递给类成员函数,并在类成员函数中访问类的成员变量。 所以,为了在pthread_create函数使用成员函数,我们可以使用静态成员函数作为线程函数,并在静态成员函数内部调用实际的类成员函数。这样就可以解决函数指针类型不匹配的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值