码迷,mamicode.com
首页 > 编程语言 > 详细

Linux下 C++ 在类中的多线程技

时间:2018-03-14 17:00:25      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:xxx   需要   oid   str   this指针   point   http   编译器   new   

有很多时候,我们希望可以在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()。但是 这样的代码在编译时即会报错:

技术分享图片

只需将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();
};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指针

4.编译时需要加上-lpthread选项。 

Linux下 C++ 在类中的多线程技

标签:xxx   需要   oid   str   this指针   point   http   编译器   new   

原文地址:https://www.cnblogs.com/xiaojianliu/p/8568106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!