您的位置:首页 > 编程语言 > C语言/C++

在C++中使用pthread

2010-01-26 00:29 274 查看

C++中使用pthread

原始地址 :http://blog.leven.com.cn/Article_19.aspx

pthread便是大名鼎鼎posix多线程库了.然而pthread多线程基于C回调函数,在C++中应用是个不大方便问题.由于c++类成员函数指针是无法直接在pthread中回调,因此,如果我们想要在C++中使用pthread多线程,必须要借助其他技巧才可以做到.

首先,我们要兼容pthread静态函数式回调,同时又要动态调用成员函数,因此,要有一个类负责转发调用,再次,我们考虑如何调用类,为了方便,我们用C++仿函数在线程内调用成员函数.

所以,首先我们想到实现一个ThreadCall类:

C++代码

class ThreadCall{

public:

static void *Fun(void *data){

//这儿如何定义呢?

}

};

我们这儿只能传入一个void*数据,但是我们需要知道数据呢?应该包括要调用类,以及要传入参数.同时,对这个类,我们还要求拥有仿函数接口,因此,我们做如下定义:

C++代码

//首先定义一个ThreadClass接口,所有回调类都直接或者间接继承自该类

//它规定了回调接口

class ThreadClass{

public:

virtual void *operator()(void *)=0;

};

C++代码

//再定义一个线程信息结构,其中包含了要调用class和出入数据

struct _threadInfo{

ThreadClass *threadClass;

void *data;

};

typedef _threadInfo ThreadInfo;

OK,再次回到我们ThreadCall类,现在我们就可方便写出它实现了:

C++代码

class ThreadCall{

public:

static void *Fun(void *data){

ThreadInfo *info=(ThreadInfo *)data;

return info->threadClass->operator ()(info->data);

}

};

这样,我们就实现了C++式使用pthread,虽然麻烦了点,但是实现了类成员函数线程调用,还是值得.现在我们来测试下:

C++代码

class MyThreadClass : ThreadClass{

public:

virtual void *operator()(void *data){

char *str=(char *)data;

cout<<str<<endl;

return NULL;

};

};

int main(int argc,char *argv[]){

MyThreadClass threadClass;

ThreadInfo info;

info.threadClass=(ThreadClass *)&threadClass;

info.data="hello";

pthread_t pid;

pthread_create(&pid,NULL,&ThreadCall::Fun,&info);

system("pause");

}

执行程序,子线程成功打印出"hello"信息.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: