Linux学习之线程封装一:基于对象的封装
2011-10-19 18:12
369 查看
线程类“CLThread”
头文件:
View Code
为什么使用static函数?
为了与pthread_create()的参数匹配:pthread_create()的第三个为void*(*start_rtn)(void*)。显然,类的普通成员函数第一个参数为隐藏的this指针,这与前面的类型不相符;编译器也会提示错误。这个参数只能是全局函数或类的静态成员函数。
为什么使用StartFunctionOfThread()而不直接声明RunThreadFunction()为static且把其作为参数传递给pthread_create()?
首先,如上个问题所述,若作为参数,限制了其参数和返回值类型,不便提供灵活的应用。本例中,返回值就不能用CLStatus等复杂数据类型,只能是可以转换为(void *)的类型。
其次,StartFunctionOfThread()相当与一个中间的管理层,它可以对参数(本例是this)和返回值进行有意义的控制和处理。
头文件:
View Code
#include <iostream> #include "CLThread.h" #include "CLLog.h" using namespace std; CLThread::CLThread() { m_pContext = 0; } CLThread::~CLThread() { } CLStatus CLThread::Run(void *pContext) { m_pContext = pContext; int r = pthread_create(&m_ThreadID, 0, StartFunctionOfThread, this); if(r != 0) { CLLog::WriteLogMsg("In CLThread::Run(), pthread_create error", r); return CLStatus(-1, 0); } return CLStatus(0, 0); } CLStatus CLThread::WaitForDeath() { int r = pthread_join(m_ThreadID, 0); if(r != 0) { CLLog::WriteLogMsg("In CLThread::WaitForDeath(), pthread_join error", r); return CLStatus(-1, 0); } return CLStatus(0, 0); } void* CLThread::StartFunctionOfThread(void *pThis) { CLThread *pThreadThis = (CLThread *)pThis; CLStatus s = pThreadThis->RunThreadFunction(); return (void *)s.m_clReturnCode; } CLStatus CLThread::RunThreadFunction() { cout << (int)m_pContext << endl; return CLStatus(0, 0); }
为什么使用static函数?
为了与pthread_create()的参数匹配:pthread_create()的第三个为void*(*start_rtn)(void*)。显然,类的普通成员函数第一个参数为隐藏的this指针,这与前面的类型不相符;编译器也会提示错误。这个参数只能是全局函数或类的静态成员函数。
为什么使用StartFunctionOfThread()而不直接声明RunThreadFunction()为static且把其作为参数传递给pthread_create()?
首先,如上个问题所述,若作为参数,限制了其参数和返回值类型,不便提供灵活的应用。本例中,返回值就不能用CLStatus等复杂数据类型,只能是可以转换为(void *)的类型。
其次,StartFunctionOfThread()相当与一个中间的管理层,它可以对参数(本例是this)和返回值进行有意义的控制和处理。
相关文章推荐
- Linux学习之线程封装五:基于接口的封装
- Linux学习之线程封装四:基于接口的封装
- Linux学习之线程封装七:基于接口的再封装
- Linux学习之线程封装六:基于模板的面向方面的封装(三个方面)
- Linux学习之线程封装三:基于模板的面向对象的封装
- muduo网络库学习(一)对io复用的封装Poller,面向对象与基于对象
- Linux学习之"线程的再封装"
- Linux学习之线程封装二:面向对象的封装
- Linux学习之出错处理(线程安全的日志类封装)
- linux开发:线程的面向对象封装
- 实现线程的封装, 2种方式(面向对象,基于对象)
- C++中面向对象和基于对象的线程封装方法
- linux学习之进程,线程和程序
- ARM-LINUX学习笔记-(虚拟机linux串口终端以及USB程序下载,基于TQ2440)
- 基于tiny4412的Linux内核移植 -- PWM子系统学习(七)
- Java 线程封装对象
- 【linux 指令学习】 taskset -pc PID 查看线程占用cpu核
- JavaScript学习_第3章_运算符__函数__基于对象
- 基于Linux的USB子系统学习 --- <基础知识与USB协议概述> ing
- 【Linux学习】pthread_create主线程与创建的新线程之间退出关系