C++中的 多线程
来源:互联网 发布:2012nba总决赛球员数据 编辑:程序博客网 时间:2024/06/08 03:21
有很多时候,我们希望可以在C++类里面对那些比较耗时的函数使用多线程技术,但是熟悉C++对象语法的人应该知道,C++类的成员函数的函数指针不能直接做为参数传到pthread_create,主要因为是C++成员函数指针带有类命名空间,同时成员函数末尾是会被C++编译器加上可以接收对象地址的this指针参数。因此需要将成员函数做一定的转化,将其转化为不被编译器加上this指针,而由我们自己来为该函数维护”this”指针即可。
举例分析
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
如上所示,代码声明了一个类Test,假设该类有一个十分耗时的成员函数:insert(),这个求和函数每次执行需要2000ms的时间。对于如此耗时的函数,我们在设计时都会想方法将其设计为线程函数,这样调用者才不会阻塞。
于是我们为其加上多线程:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
以上代码通过调用lanch()来创建多线程来执行insert_pth,insert_pth 再调用insert().
但是 这样的代码在编译时即会报错。
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
只需将insert_pth变化为static函数,同时将insert逻辑代码转移到insert_pth即可
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
总结
使用多线程处理耗时成员函数的步骤:
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++builder 中的多线程
- c中的多线程详解
- C/C++中的多线程入门
- C/C++中的多线程入门
- C/C++中的多线程入门
- C语言中的多线程编程
- C语言中的多线程编程
- 理解多线程中的ManualResetEvent(C#)
- C++/CLR 中的多线程使用方法
- C语言中的多线程编程
- C/C++中的多线程入门源码
- vs2005 中的多线程(c#),可带参数
- 【C#】多线程中的lock与token模式
- [C++]如何查找多线程中的死循环
- vs2005 中的多线程(c#),可带参数-转
- iOS (objective-c) 中的多线程互斥同步问题
- iOS (objective-c) 中的多线程互斥同步问题
- iOS (objective-c) 中的多线程互斥同步问题
- Spring-IOC容器详解
- PHP获取毫秒时间戳,利用microtime()函数
- 二进制“<<”: 没有找到接受“std::string”类型的右操作数的运算符
- HttpApplication中的异步线程
- HttpHandler与HttpModule的用处与区别
- C++中的 多线程
- SYD8801 硬件AES加密
- IIS与Asp.net
- jquery中ajax加载js和json文件
- 模拟天猫总站项目
- C# ToString()和Convert.ToString()的区别
- jquery中ajax应用——load()函数
- 0-1背包问题,两个CPU核分配任务问题
- java编程加载窗口,实现动画