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。

各个参数的含义:

  1. _Security:线程安全相关信息,默认时传递NULL。
  2. _StackSize:要分配给线程的栈大小,传递0时生成默认大小的栈。
  3. _StartAddress:传递给线程的主函数信息。
  4. _ArgList:调用main函数时传递的参数信息。
  5. _InitFlag:用于指定线程创建后的行为,传递0时,线程创建后立即进入可执行状态。
  6. _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的更多相关文章

  1. 让你的PHP程序真正的实现多线程(PHP多线程类)

    通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...

  2. PHP多线程类

    <?php /** * @title: PHP多线程类(Thread) * @version: 1.0 * @author: phper.org.cn < web@phper.org.cn ...

  3. 让你的PHP程序真正的实现多线程(PHP多线程类)(转)

    通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...

  4. PHP多线程的实现(PHP多线程类)

    通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...

  5. Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享

    Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com ...

  6. (转)多线程——继承Thread 类和实现Runnable 接口的区别

    java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...

  7. 多线程——继承Thread类实现一个多线程

    继承Thread类实现一个多线程 Thread类部分源码: package java.lang; //该类实现了Runnable接口 public class Thread implements Ru ...

  8. Java 多线程之 Thread 类 和 Runnable 接口初步使用

    目录 Thread 类 Thread之定义线程类 Thread之开启线程 Runnable 接口 Runnable 之定义线程类 Runnable 之开启线程 @ Thread 类 Thread 类是 ...

  9. 多线程, Thread类,Runnable接口

    多线程 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序. 单线程程序:即,若有多个任务只能依次执 ...

随机推荐

  1. 六月计划#1A(6.1-6.8)

    5/35 数学 BZOJ_[HNOI2008]_Cards_(置换+Burnside引理+乘法逆元+费马小定理+快速幂) BZOJ_1005_ [HNOI2008]_明明的烦恼_(组合数学+purfe ...

  2. jquery easyui treegrid使用小结

    在实际应用中可能会碰到不同的需求,比如会根据每行不同的参数或属性设置来设置同列不同的editor类型,这时原有的例子就显的有点太过简单,不能实现我们的需求,现在应用我在项目中的操作为例,显示下实现同列 ...

  3. HashSet的实现原理

    HashSet定义 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Clonea ...

  4. CodeForces 370A Rook, Bishop and King

    此题看似很简单,但实际上有不少细节,WA点不少.分情况处理即可. #include<cmath> #include<cstdio> #include<string> ...

  5. Cocos2d-x获取随机数

    计算机是无法产生真正的随机数的,都是伪随机.获取随机数的方式和算法多种多样,这里只给出一种方法,基于最新的C++11. 1 2 3 4 5 #include <random> std::u ...

  6. Fixing ssh login long delay

    原文:http://injustfiveminutes.com/2013/03/13/fixing-ssh-login-long-delay/ For a long time I had a prob ...

  7. 用BigDecimal类实现Fibonacci算法

    Fibonacci(N)=Fibonacii(N-1)+Fibonacci(N-2) 其中 Fibonacci(0)=0;Fibonacci(1)=1 用循环或则递归实现Fibonacci算法很简单, ...

  8. 计蒜客 取数游戏(dp)

    有如下一个双人游戏:N个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,每次有数字被一个玩家取走后,这个数字被从序列中去掉并累加到取走该数的玩家的得分中,当数取尽时,游戏结束.以最终得分多者 ...

  9. DOCTYPE与浏览器模式详解(标准模式&混杂模式)

    关于渲染模式: 在多年以前(IE6诞生以前),各浏览器都处于各自比较封闭的发展中(基本没有兼容性可谈).随着WEB的发展,兼容性问题的解决越来 越显得迫切,随即,各浏览器厂商发布了按照标准模式(遵循各 ...

  10. Sublime Text 教程

    编辑器的选择(Editor Choices) 从初学编程到现在,我用过的编辑器有EditPlus.UltraEdit.Notepad++.Vim.TextMate和Sublime Text,如果让我从 ...