Linux下多线程编程——C++版本

http://blog.csdn.net/fastsort/article/details/7831902

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. /************************************* 
  2. 1,Dog 类中有2个函数成员, 
  3. shout 启动线程, 
  4. ************************************/  
  5. #include <iostream>  
  6. #include <pthread.h>  
  7. #include <stdlib.h>  
  8.   
  9. using namespace std;  
  10.   
  11. class Dog  
  12. {  
  13.   private:  
  14.         string name;  
  15.         int age;  
  16.         pthread_t pid;//对象成长线程标号  
  17.         bool live;  
  18.   
  19.   public:  
  20.     Dog(int n=1,string nm="Hali");  
  21.     void shout();  
  22.     pthread_t getPID();  
  23.   
  24.     friend void * growing(void * o);//dog growing thread  
  25.     friend void * dshout(void * o);//shout thread  
  26. };  
  27. /******** 
  28. 成长线程,每2秒age加1 
  29. 直到age等于20 
  30. *******/  
  31. void * growing(void * o)  
  32. {  
  33.     Dog *d=(Dog*)o;  
  34.     while(d->age < 21)  
  35.     {  
  36.         sleep(2);  
  37.         ++d->age;  
  38.     }  
  39.     d->live=false;//dead and quit  
  40. }  
  41. Dog::Dog(int n, string nm):  
  42.     age(n),name(nm)  
  43. {  
  44.     pthread_t id;  
  45.     int res;  
  46.     res=pthread_create(&id,NULL,growing,this);  
  47.     if(res!=0)  
  48.     {  
  49.         cerr<<"Error!"<<endl;  
  50.         exit(1);  
  51.     }  
  52.     pid=id;  
  53.     live=true;  
  54.     cout<<"I'm a dog,my name is "<<name<<endl;  
  55.   
  56. }  
  57. void* dshout(void *o)  
  58. {  
  59.     Dog *d=(Dog*)o;  
  60.     while(d->live)  
  61.     {  
  62.         cout<<"My name is "<< d->name << ", I'm " <<d->age <<" now. "<< endl;  
  63.         sleep(3);  
  64.     }  
  65. }  
  66. void Dog::shout()  
  67. {  
  68.     pthread_t id;  
  69.     int res=pthread_create(&id,NULL,dshout,this);  
  70.     if(res!=0)  
  71.     {  
  72.         cerr<< "Error shout!" <<endl;  
  73.         exit(1);  
  74.     }  
  75. }  
  76. pthread_t Dog::getPID()  
  77. {  
  78.     return pid;  
  79. }  
  80.   
  81. int main()  
  82. {  
  83.     Dog a,b(4,"Benjm");  
  84.     a.shout();  
  85.     b.shout();  
  86.   
  87.     while(1)  
  88.     {  
  89.         cout<<"\t\t\t Main Waiting ...."<<endl;  
  90.         sleep(5);  
  91.     }  
  92.     return 0;  
  93. }  

一个很简单的例子。


0
0
 
 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值