首页 > 代码库 > C++实现多线程类Thread
C++实现多线程类Thread
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。
各个参数的含义:
- _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方法。
完整实现:
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(),就可以实现多线程了。
C++实现多线程类Thread
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。