您的位置:首页 > 运维架构 > Linux

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

2017-06-07 23:21 323 查看
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,要么将线程函数写在类外。使用线程函数的参数将对象传递进线程函数。

一个例子如下:

[cpp]
view plain
copy
print?

/************************************* 
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;  
}  

一个很简单的例子。

顶0踩0
 
 
上一篇Red hat Linux 9.0出现乱码
下一篇Linux下Socket编程(TCP)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: