博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++实现多线程类Thread
阅读量:7104 次
发布时间:2019-06-28

本文共 1650 字,大约阅读时间需要 5 分钟。

Windows编程中创建线程的常见函数有:CreateThread、_beginthread、_beginthreadex。据说在任何情况下_beginthreadex都是较好的选择。

_beginthreadex的参数虽然多,但是大部分填NULL或0使用默认值就可以了。

1     uintptr_t __cdecl _beginthreadex(void * _Security, unsigned _StackSize,2         unsigned(__stdcall * _StartAddress) (void *), void * _ArgList,3         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方法。

完整实现:

1     class Thread { 2     public: 3         void start(); 4         virtual unsigned run(); 5         HANDLE getThread(); 6     private: 7         HANDLE hThread; 8         static unsigned WINAPI agent(void *p); 9     };10     void Thread::start() {11         hThread = (HANDLE)_beginthreadex(NULL, 0, agent, (void*)this, 0, NULL);12     }13     unsigned Thread::run() {14         puts("Base Thread");15         return 0;16     }17     unsigned WINAPI Thread::agent(void *p) {18         Thread *agt = (Thread*)p;19         unsigned res = agt->run();20         return res;21     }22     HANDLE Thread::getThread() {23         return hThread;24     }

 

在Thread类的派生类中,只要重载run(),就可以实现多线程了。

 

posted on
2014-09-11 20:57 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/zinthos/p/3967229.html

你可能感兴趣的文章
有趣的鸡蛋问题,应该还可以进一步简化
查看>>
Halcon算子翻译——endtry
查看>>
用Windows 8开发第一个Windows应用商店应用
查看>>
Lua获取系统时间和时间格式化方法及格式化参数
查看>>
牛客练习赛12 A 圆圆 . B 迷宫
查看>>
vue Element动态设置el-menu导航当前选中项
查看>>
session的使用
查看>>
Centos6.8通过yum安装mysql5.7
查看>>
[LeetCode]Longest Consecutive Sequence
查看>>
NCBI通过氨基酸位置查看相邻SNP
查看>>
CAS SSO单点登录框架学习
查看>>
好书推荐——《启动大脑》
查看>>
网络流24题 -No.17 运输问题
查看>>
MySQL数据库的主从复制简单学习使用
查看>>
kprobe原理与实现笔记
查看>>
sql语句优化
查看>>
Topological Sorting
查看>>
sql语句大全
查看>>
MongoDB server side Javascript 如何直接传入字符串?
查看>>
ZooKeeper学习第五期--ZooKeeper管理分布式环境中的数据
查看>>