c++类内多线程

来源:互联网 发布:初一地理行知天下答案 编辑:程序博客网 时间:2024/05/20 22:00

前言

有很多时候,我们希望可以在C++类里面对那些比较耗时的函数使用多线程技术,但是熟悉C++对象语法的人应该知道,C++类的成员函数的函数指针不能直接做为参数传到pthread_create,主要因为是C++成员函数指针带有类命名空间,同时成员函数末尾是会被C++编译器加上可以接收对象地址的this指针参数。因此需要将成员函数做一定的转化,将其转化为不被编译器加上this指针,而由我们自己来为该函数维护”this”指针即可。

举例分析

#include <stdio.h>#include <stdlib.h>#include <iostream>#include <time.h>using namespace std;class Test{    public:        int sum=0;        int cnt;    public:        int insert();};int Test::insert(){    sleep(2);    cnt+=1;}

如上所示,代码声明了一个类Test,假设该类有一个十分耗时的成员函数:insert(),这个求和函数每次执行需要2000ms的时间。对于如此耗时的函数,我们在设计时都会想方法将其设计为线程函数,这样调用者才不会阻塞。
于是我们为其加上多线程:

#include <stdio.h>#include <stdlib.h>#include <iostream>#include <time.h>#include <unistd.h>#include <pthread.h>using namespace std;class Test{    public:        int sum=0;        int cnt;    public:        int insert();        void * insert_pth(void*);        void lanch();};int Test::insert(){    sleep(2);    sum+=1;}void * Test::insert_pth(void*){    insert();}void Test::lanch(){    pthread_t pth;    pthread_create(&pth,NULL,insert_pth,NULL);}int main(){    Test t;    t.lanch();    return 0;}

以上代码通过调用lanch()来创建多线程来执行insert_pth,insert_pth 再调用insert().
但是 这样的代码在编译时即会报错。

pthread.cpp: In member functionvoid Test::lanch()’:pthread.cpp:30:42: error: invalid use of non-static member function  pthread_create(&pth,NULL,insert_pth,NULL);

只需将insert_pth变化为static函数,同时将insert逻辑代码转移到insert_pth即可

#include <stdio.h>#include <stdlib.h>#include <iostream>#include <time.h>#include <unistd.h>#include <pthread.h>using namespace std;class Test{    public:        int sum=0;        int cnt;    public:        int insert();    static  void * insert_pth(void*);        void lanch();};int Test::insert(){    sleep(2);    sum+=1;    printf("%d insert.....\n",sum);}void * Test::insert_pth(void* __this){    Test * _this =(Test *)__this;    sleep(2);    _this->sum+=1;    printf("%d insert.....\n",_this->sum);}void Test::lanch(){    pthread_t pth;    pthread_create(&pth,NULL,insert_pth,(void*)this);}int main(){    Test t;    t.sum=0;    t.lanch();    sleep(5);    return 0;}

总结

使用多线程处理耗时成员函数的步骤:
1. 声明另外一个静态函数:static void XXX_pth(void __this);
该函数与目标成员函数在函数名尽量保持一致
2. 将原成员函数的代码拷贝至void * XXX_pth(void * __this);
在 XXX_pth()开始处将void * __this 转化为 对象的指针 ObjectPoint _this;
将拷贝下来的所有成员变量加上_this->
3. 编写线程启动代码。
注意pthread_create()最后一个参数传入this指针

注意

在 XXX_pth()函数内容不要调用类的其它成员函数,否则成员函数将无法获取正确的this指针而操作错误内存,从而导致segmantation fault.
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 铁杆山药粉 葛根粉山药粉 杏仁山药粉 山药粉薏米粉 山药粉薏仁粉 山药粉的好处 木瓜粉葛根粉山药粉 吃山药粉有什么好处 山药粉加蜂蜜 山药粉能做面膜吗 生山药粉 怎样制作山药粉 山药粉制作方法 如何制作山药粉 女性每天坚持喝山药粉的好处 山药粥做法大全 山药粥做法 山药胡萝卜粥 山药粥功效 山药百合粥 紫薯山药粥 山药绿豆粥 山药排骨粥 山药煮粥的做法 红枣山药莲子粥 百合山药粥的做法大全 红豆薏米山药粥 宝宝山药粥的做法大全 薏米芡实山药粥的功效 山药瘦肉粥的做法 山药芡实薏米粥功效 山药紫薯粥的做法 绿豆山药粥的功效 山药粥的家常做法 红枣山药粥的功效 山药红枣粥的功效 薏米红豆粥的比例 薏米粥怎么煮 薏苡仁粥 薏米粥怎么做 山药熬粥的做法