Linux下多线程编程
来源:互联网 发布:js then 函数 编辑:程序博客网 时间:2024/05/20 18:53
Linux 下创建线程的函数是 pthread_create(),函数原型是:
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
参数说明:
thread:指向pthread_t类型(即指向线程)的指针,用于引用新创建的线程,实质为线程id。
attr:用于设置线程的属性,一般不需要特殊的属性,初级选手设置为NULL即可。
*(*start_routine)(void *):传递新线程所要执行的函数地址。
arg:新线程所要执行的函数的参数。
调用如果成功,则返回值是0,如果失败,如超过系统规定的最大线程数或内存不足,则返回错误代码。
前2个参数很简单,主要所后面2个参数。
第三个参数为线程实际运行函数的地址,即需要传一个函数指针过去,第四个则所该函数的参数,也是指针。
使用面向过程的多线程较为简单,例子就不列举了。可是将简单的面向过程改为面向对象时,如将线程函数写为类的成员函数时,编译器总是报错。类型转换无效!!
开始时怎么改变类型都是不行。后来未发现把之前可以用的函数声明为类成员时,这是再创建线程时也不能用类。我才意识到可能与类有关。经查询,类中的线程函数成员必须声明为static,否则参数将不匹配。为什么呢?
看第四个参数,类型为void *,而类成员函数即使你声明为void * ,但是还有一个隐含参数this,所以编译器报类型转换无效了!!!!!
解决方法,要么将线程函数声明为static,要么将线程函数写在类外。使用线程函数的参数将对象传递进线程函数。
一个例子如下:
/*************************************1,Dog 类中有2个函数成员,shout 启动线程,************************************/#include <iostream>#include <pthread.h>#include <stdlib.h>using namespace std;class Dog{ private: string name; int age; pthread_t pid;//对象成长线程标号 bool live; public: Dog(int n=1,string nm="Hali"); void shout(); pthread_t getPID(); friend void * growing(void * o);//dog growing thread friend void * dshout(void * o);//shout thread};/********成长线程,每2秒age加1直到age等于20*******/void * growing(void * o){ Dog *d=(Dog*)o; while(d->age < 21) { sleep(2); ++d->age; } d->live=false;//dead and quit}Dog::Dog(int n, string nm): age(n),name(nm){ pthread_t id; int res; res=pthread_create(&id,NULL,growing,this); if(res!=0) { cerr<<"Error!"<<endl; exit(1); } pid=id; live=true; cout<<"I'm a dog,my name is "<<name<<endl;}void* dshout(void *o){ Dog *d=(Dog*)o; while(d->live) { cout<<"My name is "<< d->name << ", I'm " <<d->age <<" now. "<< endl; sleep(3); }}void Dog::shout(){ pthread_t id; int res=pthread_create(&id,NULL,dshout,this); if(res!=0) { cerr<< "Error shout!" <<endl; exit(1); }}pthread_t Dog::getPID(){ return pid;}int main(){ Dog a,b(4,"Benjm"); a.shout(); b.shout(); while(1) { cout<<"\t\t\t Main Waiting ...."<<endl; sleep(5); } return 0;}
一个很简单的例子。
- linux下多线程编程
- linux下多线程编程
- LINUX 下多线程编程
- Linux下多线程编程
- Linux下多线程编程
- linux 下多线程编程
- linux下多线程编程
- linux下多线程编程
- LInux 下多线程编程
- Linux下多线程编程
- Linux下多线程编程
- Linux下多线程编程
- Linux下多线程编程
- linux下多线程编程
- Linux下多线程编程
- linux下多线程编程
- Linux下多线程编程
- linux下多线程编程
- 谷歌三大核心技术(三)Google BigTable
- LTIB详解(六)部署文件
- uImage与zImage的区别
- iphone开发资源汇总
- strutsbar
- Linux下多线程编程
- Linux环境进程间通信(三) 消息队列
- gl glu glut函数简介
- 设计模式原则详解
- Radar Installation 贪心 hoj
- Linux环境进程间通信(四) 信号灯
- 《杠杆阅读术》——读书笔记
- 【企业各层级工作内容比重】合理分配各项工作,最大化挖掘能力潜质
- 苹果风波再起——作家联盟控诉其侵权