C++实现多线程类Thread
Windows编程中创建线程的常见函数有:CreateThread、_beginthread、_beginthreadex。据说在任何情况下_beginthreadex都是较好的选择。
_beginthreadex的参数虽然多,但是大部分填NULL或0使用默认值就可以了。
uintptr_t __cdecl _beginthreadex(void * _Security, unsigned _StackSize,
unsigned(__stdcall * _StartAddress) (void *), void * _ArgList,
unsigned _InitFlag, unsigned * _ThrdAddr);
成功时返回线程句柄,失败时返回NULL。
各个参数的含义:
- _Security:线程安全相关信息,默认时传递NULL。
- _StackSize:要分配给线程的栈大小,传递0时生成默认大小的栈。
- _StartAddress:传递给线程的主函数信息。
- _ArgList:调用main函数时传递的参数信息。
- _InitFlag:用于指定线程创建后的行为,传递0时,线程创建后立即进入可执行状态。
- _ThrdAddr:用于保存线程ID的变量地址值。
通常只要指定_StartAddress与_ArgList的值就可以了,其他参数直接使用默认值。
_StartAddress是一个返回值为unsigned的WINAPI函数。
我们要实现一个C++的多线程基类,用户在派生类中重载run方法,然后调用start方法来开始线程。
如果直接将类中的run方法作为线程的主函数参数传递的话,会有编译错误提示,表示类型与_StartAddress不符。
这是因为类中的方法都有一个隐含的参数this指针。
我们可以通过一个静态方法agent来避开隐含的参数this指针,并将this指针作为直接的参数传递给它。
在agent方法中,通过this指针调用类中的run方法。
完整实现:
class Thread {
public:
void start();
virtual unsigned run();
HANDLE getThread();
private:
HANDLE hThread;
static unsigned WINAPI agent(void *p);
};
void Thread::start() {
hThread = (HANDLE)_beginthreadex(NULL, , agent, (void*)this, , NULL);
}
unsigned Thread::run() {
puts("Base Thread");
return ;
}
unsigned WINAPI Thread::agent(void *p) {
Thread *agt = (Thread*)p;
unsigned res = agt->run();
return res;
}
HANDLE Thread::getThread() {
return hThread;
}
在Thread类的派生类中,只要重载run(),就可以实现多线程了。
C++实现多线程类Thread的更多相关文章
- 让你的PHP程序真正的实现多线程(PHP多线程类)
通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...
- PHP多线程类
<?php /** * @title: PHP多线程类(Thread) * @version: 1.0 * @author: phper.org.cn < web@phper.org.cn ...
- 让你的PHP程序真正的实现多线程(PHP多线程类)(转)
通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...
- PHP多线程的实现(PHP多线程类)
通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...
- Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享
Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com ...
- (转)多线程——继承Thread 类和实现Runnable 接口的区别
java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...
- 多线程——继承Thread类实现一个多线程
继承Thread类实现一个多线程 Thread类部分源码: package java.lang; //该类实现了Runnable接口 public class Thread implements Ru ...
- Java 多线程之 Thread 类 和 Runnable 接口初步使用
目录 Thread 类 Thread之定义线程类 Thread之开启线程 Runnable 接口 Runnable 之定义线程类 Runnable 之开启线程 @ Thread 类 Thread 类是 ...
- 多线程, Thread类,Runnable接口
多线程 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序. 单线程程序:即,若有多个任务只能依次执 ...
随机推荐
- 【转】自定义垂直的UISlider
原文网址:http://www.cocoachina.com/bbs/read.php?tid=96282 怎样自定义垂直的UISlider? UISlider弄成垂直的代码就是:slider.tra ...
- epub3 in action: epub3文件格式简介
epub3文件就是一个符合epub3标准,以epub为扩展名的zip压缩文件.epub3标准则是基于html5.css3.svg等web标准以及mathML等来展示内容.下图就是一个简单epub3文件 ...
- [转]NHibernate之旅(13):初探立即加载机制
本节内容 引入 立即加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的加载机制——延迟加载.其本质就是使用GoF23中代理模式 ...
- [liu yanling]测试用例的设计方法
一.功能测试 1.对话框测试输入进行测试.包括中文字符.英文字符.数字字符.特殊字符.及几种字符的组合. 2.对界面可操作按钮进行测试.包括[新增(N)][保存(S)][修改(M) ...
- python导入模块时的路径疑惑
有一个事儿,以前没注意,今天发现了,记录一下. 假设一个python文件a.py中,有一段代码,是打印当前路径的.当单独执行a.py文件的时候,打印的是a.py的位置. 但是当a.py文件被其他pyt ...
- IIS7 性能(内存、CPU、当前请求耗时)监测
程序上线了,但运行过程中如果发现很CPU.内存异常,某些操作耗时,如何在生产环境中监测并查明原因呢,有以下几种工具(方式): 1.NProfiler,这是一个商业软件,有试用周期,可以监测包括Winf ...
- Android SDK 离线安装方法
有朋友反映从连接直接下载安装包不能获取到最新版本(每次更新后的包地址需要重新去查找),而且经常无法访问. 最方便的方法是使用代理或vpn接入网络,即可及时下载最新版sdk. 作为一名开发人员,流畅地浏 ...
- bzoj 3172 [Tjoi2013]单词(fail树,DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3172 [题意] 题目的意思是这样的,给若干个单词,求每个单词在这一堆单词中的出现次数. ...
- CGAffineTransformMake(a,b,c,d,tx,ty) 矩阵运算的原理
简记: CGAffineTransformMake(a,b,c,d,tx,ty) ad缩放bc旋转tx,ty位移,基础的2D矩阵 公式 x=ax+cy+tx y=bx+dy+ty 1.矩阵的基本 ...
- Headless MSBuild Support for SSDT (*.sqlproj) Projects [利用msbuild自动化部署 .sqlproj]- 摘自网络
Update: breaking change: http://sqlproj.com/index.php/2012/10/dacfx-sept-2012-updates-break-headless ...