前言

有很多时候,我们希望可以在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 function ‘void Test::lanch()’:
pthread.cpp:30:42: error: invalid use of non-static member functionpthread_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.

C++ 在类里面使用多线程技术相关推荐

  1. Python Qt GUI设计:QTimer计时器类、QThread多线程类和事件处理类(基础篇—8)

    目录 1.QTimer计时器类 2.QThread多线程类 3.事件处理类 一般情况下,应用程序都是单线程运行的,但是对于GUI程序来说,单线程有时候满足不了需求.例如,如果需要执行一个特别耗时的操作 ...

  2. Oracle字符串转BooIean,利用Java的多线程技术实现数据库的访问.pdf

    利用Java的多线程技术实现数据库的访问.pdf 第 卷第 期 计算机应用 22 12 Voi .22 , No . 12 年 月 2002 12 Computer Appiications Dec ...

  3. android progressbar 不显示_Android多线程技术选型最全指南(1)

    码个蛋(codeegg) 第 935 次推文 作者:qing的世界 链接:https://juejin.im/post/5d1eb4acf265da1bb003de71 前言 前段时间在组内做了一下现 ...

  4. 计算机网络多线程通信,多线程技术的PLC与PC的通讯方式

    基于多线程技术的PLC与PC的通讯方式 1.系统构成 推进系统中,PC机选用工控计算机.它是整个控制系统的核心,是上位机.其主要利用良好的图形用户界面,显示从PLC接收的开关量和控制手柄的位置,进行一 ...

  5. qt qthead里如何响应信号_Qt 中的多线程技术(翻译)

    原文链接 Multithreading Technologies in Qt​doc.qt.io 正文 Qt 提供一系列的类与函数来处理多线程.Qt 开发者们可以使用下面四种方法来实现多线程应用. Q ...

  6. C#多线程技术总结(异步)

    我这里针对现有的C#多线程技术进行一个汇总,一是复习,二是方便索引,文章部份知识点来源于网络,非本人原创. 一.并行(异步): 1.System.Threading.Tasks命名空间下的(TPL): ...

  7. 服务端断开_Java多线程技术:实现多用户服务端Socket通信

    一.多用户服务器 多用户服务器是指服务器能同时支持多个用户并发访问服务器所提供的服务资源,如聊天服务.文件传输等. 上一篇的TCPServer是单用户版本,每次只能和一个用户对话.我们可以尝试多用户连 ...

  8. 多线程_C# 多线程技术

    这节讲一下多线程(Thread)技术. 在讲线程之前,先区分一下程序,进程,线程三者的区别,大体上说,一个程序可以分为多个进程,一个进程至少由一个线程去执行,它们是层层包含的关系.我们写的程序,就是一 ...

  9. mfc多线程编程实例_多线程技术的PLC与PC的通讯方式

    点击箭头处"工业之家",选择"关注公众号"! 基于多线程技术的PLC与PC的通讯方式 1.系统构成  推进系统中,PC机选用工控计算机.它是整个控制系统的核心, ...

最新文章

  1. Windows下RStudio环境安装
  2. SafeSEH原理与对抗
  3. Spring MVC 和 Spring 总结
  4. 你对博客中提到的评分规则有何意见和建议?
  5. c语言程序出现错误,C语言程序错误,不能正常读写文件,求解啊
  6. linux的locate工具,linux文本查找工具之locate、find
  7. java代码查询索引文件实例_关于使用pdfbox的对PDF文件通过lucene生成索引文件IndexPDFFiles类代码示例...
  8. MySql Cluster 集成安装,Centos,坑点集锦
  9. matlab 绘花,【原创】使用matlab绘制菊花和玫瑰花
  10. 【CFD之道】2018年原创文章汇总
  11. 杰理之低延时无线麦功能支持以下两种组合配置【篇】
  12. 计算机模拟专业委员会,中国化工学会过程模拟及仿真专业委员会成立
  13. SumaTraPDF
  14. Excel 2010 SQL应用105 域聚合函数之第一个和最后一个
  15. .net MVC使用GetOrgChart实现树形关系结构组织架构图
  16. Altium Designer(2)-抄板以及绘制原理图
  17. landlord攻略_全攻略:在卡尔加里如何当好房东-之(三)合同篇
  18. 北京2016计算机应用自考,02316自考全国2016年4月计算机应用技术试题.doc
  19. 安信可VB01离线语音模块接入智能窗帘指导
  20. 解读最佳实践:倚天 710 ARM 芯片的 Python+AI 算力优化 | 龙蜥技术

热门文章

  1. yolo-v2 翻译
  2. linux驱动编程——ch340x驱动移植
  3. vbs整人代码蓝屏_求一些VB恶搞代码。效果越厉害越好,例如:蓝屏.等等
  4. [Python]学习笔记5——For循环
  5. 影院服务器可以给投影机信号吗,投影机有哪些接口类型 投影机接口类型与连接知识【介绍】...
  6. C. Anu Has a Function---------------------------思维
  7. 计算机sci有哪些AJCHE,最新SCI目录(大类加小类,齐全).xls
  8. kong笔记——自定义插件 目录及部署
  9. qfp封装能够linux,MCU的封装也是很有门道的...
  10. Python背单词记单词小程序,可自定义词库,支持多种记忆模式,根据词义拼写、选择单词,根据词意选择单词