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接口
多线程 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序. 单线程程序:即,若有多个任务只能依次执 ...
随机推荐
- 海量数据的二度人脉挖掘算法(Hadoop 实现)
最近做了一个项目,要求找出二度人脉的一些关系,就好似新浪微博的“你可能感兴趣的人” 中,间接关注推荐:简单描述:即你关注的人中有N个人同时都关注了 XXX . 在程序的实现上,其实我们要找的是:若 U ...
- bzoj1565
很明显是最大权闭合子图,但要注意互相保护的植物打不掉,被互相保护的植物所直接或间接保护的植物也打不掉我们先拓扑排序然后dfs出能打掉的点,然后做最大权闭合子图 ; type node=record p ...
- PHP imdb类多个跨站脚本漏洞
漏洞版本: PHP imdb Classes 2-2.1.5 漏洞描述: BUGTRAQ ID: 64542 PHP是一种HTML内嵌式的语言. PHP imdb类2-2.1.5及其他版本在实现上存在 ...
- web移动开发最佳实践之html篇
一.前言 在目前的移动应用开发大潮下,使用web技术进行移动应用开发正变得越来越流行,它主要使用html5.css3.js等技术,在跨平台性.可移植性方面具有无可比拟的优势,特别适合开发对性能要求不太 ...
- SharePoint 2010 WSP包部署过程中究竟发生什么?
转:http://www.xue163.com/158/6/1585365.html 在SharePoint 2010中,我们可以使用Visual Studio 2010轻松创建WSP包来安装Web ...
- .Net 提交页面,js修改的Label值会丢掉
<head id="Head1" runat="server"> <script src="../Jquery/jquery-1.1 ...
- Lua中实现队列(高效方式)
转自http://www.cnblogs.com/stephen-liu74/archive/2012/06/25/2417894.html 在Lua中实现队列的简单方法是使用table库函数inse ...
- 【CSS3】Advanced11:Media Queries
1.Browser-size specific CSS @media screen and (max/min-width:1000px){} 2.Orientation-specific CSS? @ ...
- 【CSS】Beginner2:Selectors, Properties, and Values
1.Whereas HTML has tags,CSS has selectors. 2.Selector{ properties:value; properties2:value2; } 3 ...
- Codeforces 650C Table Compression (并查集)
题意:M×N的矩阵 让你保持每行每列的大小对应关系不变,将矩阵重写,重写后的最大值最小. 思路:离散化思想+并查集,详见代码 好题! #include <iostream> #includ ...