本文的主题是用C++的类来封装一个线程,代码很简单,主要总结一下,里面的注意点。先来看代码:
#include <iostream>
#include <memory>
#include <pthread.h>
using namespace std;
class myThread
{
public:
myThread()
:m_id(0)
{}
void Start()
{
pthread_create(&m_id,NULL,Routine,NULL);
}
protected:
static void* Routine(void*)
{
cout<<"hello world"<<endl;
return 0;
}
pthread_t m_id;
};
int main(int argc, char* argv[])
{
myThread t;
t.Start();
getchar();
return 0;
}
运行的结果就是打印了 hello world
对于创建线程的函数 pthread_create(),我们先来看一下系统对于参数的说明
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
可以看到第三个参数是线程函数的入口地址,而且函数的参数只有一个是void* 类型
到这里大家可能认为这很简单,但在刚开始写程序的时候很多人会把Routine函数前面的static给漏 (包括我在内),好了那我们把Routine函数前面的static去掉,再去编译一下,就会出现以下的错误:
实参类型为 void* (myThread::)(void*) 与void*(*)(void*) 不匹配
问题很明显是出在了static这边了,当时我也很郁闷,没加static为什么会报错呢,原因相信大家都看到了上面报错的内容,定义的函数与pthread_create()第三个参数不匹配。后来查看了网上的一些资料,终于得到了一个答案,关于static声明静态成员函数的用法在这里我就不多说了,我就说下这里为什么会报错。成员函数与一般函数到底有什么区别 ?而C++编译器是怎么样来区分两者的关系的?实际上C++编译器只做了一件事情就是在成员函数的后面加了他自己的类的参数。而一般函数当然就不会加那么一个参数。当我们在成员函数前面加了个static 修饰的时候,编译器就不会多加一个参数了。好了,到这里就真相大白了。大家继续吃着火锅,唱着歌,写程序吧。上面所说的有什么错误的,大家尽管指出。