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接口
多线程 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序. 单线程程序:即,若有多个任务只能依次执 ...
随机推荐
- bzoj1069
四边形的问题可以转化为三角形处理穷举对角线,然后处理上下两个三角形,旋转卡壳 ..] of double; q:..] of longint; l,r,i,j,k,t,n:longint; ans:d ...
- FlowLayoutPanel autowrapping doesn't work with autosize
There is no such thing like impossible in software development. Impossible just takes longer. I've i ...
- POJ 2502 Subway dij
这个题的输入输出注意一下就好 #include<cstdio> #include<cstring> #include<queue> #include<cstd ...
- POJ ---3070 (矩阵乘法求Fibonacci 数列)
Fibonacci Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 ...
- 【原创】LoadRunner Java Vuser开发环境配置指南
1 编写目的 本文主要介绍Java运行环境的配置,同时通过编写HelloWorld程序,讲解在LoadRunner下如何开发简单的Java Vuser脚本.关于Java语言的深入学习,大家可以参考其他 ...
- 【原】1.1RDD源码解读(二)
(6)transformation 操作,通过外在的不同RDD表现形式来达到内部数据的处理过程.这类操作并不会触发作业的执行,也常被称为lazy操作. 大部分操作会生成并返回一个新的RDD,例sort ...
- 转(NLP必读)
如果你刚接触自然语言处理并对她感兴趣,最好读几本这方面的书籍,除了能让你知道自然语言处理各个领域是干什么的外,还能培养一下NLP的感觉.以下四本书是我读研期间阅读和接触过的,如果您还有好书推荐,欢迎补 ...
- 使用 Visual Studio 分析器找出应用程序瓶颈(转)
使用 Visual Studio 分析器找出应用程序瓶颈 Hari Pulapaka and Boris Vidolov 本文讨论: 以性能瓶颈为目标 应用程序代码分析 比较分析数据 性能报告 本文使 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- ios开发 UITableViewController
iOS中显示数据列表最常用的一个控件,支持垂直滚动 UITableView的两种内置样式UITableViewStylePlain UITableViewStyleGrouped 数据源(data ...