pthread_create的第三个参数为什么必须是静态函数???

#include 
int pthread_create(pthread_t* thread, const pthread_attr_t* attr,
					void *(*start_routine)(void*), void *arg);

上面是pthread_create函数的声明,这个声明看起来一片安静祥和,然而当在某个类的实现中调用pthread_create函数时,就有可能出现参数类型不匹配的情况。比如第三个参数填入一个类中的非静态函数时。。。

为何pthread_create的第三个参数必须是静态函数???

这是因为类的成员函数在调用时除了传进参数列表的参数之外,还会再传入一个this指针,指向调用此函数的对象。只有传入这个this指针,函数在执行过程中才能调用其他非静态成员变量和非静态成员函数。

因此,如果我们的pthread_create函数如果传进了一个形如 void* func(void*)的非静态成员函数,那么恭喜你,程序将会报错,因为编译器在你看不见的地方还给你附加了一个参数this*。

那要传入一个类内的函数,咋办呢? 只能传入一个静态函数了。

那我传入一个静态函数之后又不能用其他的非静态成员,这有啥意思捏?难道要我把所有成员都改成静态成员???

兄弟大可不必,老夫找到了两个办法可以解决这个问题:

  1. 通过类的静态对象来调用。比如单例模式中,静态函数就可以通过唯一的那个静态实例对象来调用非静态成员。(要不自己在函数里创建一个对象也能玩)
  2. 将类的对象作为参数传递给该静态成员。pthread_create函数的第三个参数start_routine函数不是能接受一个指针作为参数吗,那就在调用pthread_create函数时把this指针作为参数穿传过去好了。就像这样:
MyClass::MyClass()  // 在构造函数里面
{
	pthread_create(tid, NULL, worker, this);
	...
}

void* MyClass::worker(void* arg)
{
	// 用这个对象就能去调用非静态成员了
	MyClass* myClass = (MyClass*)arg; 
	...
}

你可能感兴趣的:(Linux)