问题如下
pthread_create error: invalid use of non-static member function
先简要解释下pthread_create这个函数的各个参数:
param1: 为指向线程标识符的指针。
param2: 用来设置线程属性。
param3: 线程运行函数的起始地址。
param4: 运行函数的参数。
出错往往是第三个参数,报错的原因要求我们要将该参数设置成静态函数,但是这里有个问题 ,这个函数我们往往可能需要访问到它所属类的非静态成员变量,而设置成静态函数的话只能访问静态变量了。就如下这个例子是编译不过的
/* 错误例子 */
//StaticAddOne这个函数是HttpServer的静态成员函数
void* HttpServer::StaticAddOne(){
this->nums ++; //this不能出现在静态成员中,编译不通过
}
那怎么办呢,我们可以再写一个静态函数,然后把上面的AddOne放进去。注意 此时我们就不需要static来修饰AddOne函数了。
//Static_ExecAddOne这个函数是HttpServer的静态成员函数
void* HttpServer::Static_ExecAddOne(void* pThis)
{
static_cast<HttpServer *>(pThis)->AddOne();
}
使用pthread_create的使用只需要把this指针当做参数传入就行了,如下:
pthread_create(&thread_id, NULL, Static_ExecAddOne, (void*)this);
这样就可以保证AddOne可以访问到类中的其他非静态成员变量了,同时也不会报错。