linux下C++对线程的封装
2015-11-23 20:36
615 查看
之前一直是使用C语言,前段时间转做C++。无论使用什么语言,多线程编程都是不可或缺的。最近项目中又用到了线程,现在将线程的封装做出总结:
1、线程类中应该包含线程ID、线程的状态以及线程基本操作等。
2、线程需要的基本操作都差不多,唯一不同的是线程执行的函数体。因此大多数操作都可以写在基类中,当需要使用线程时,只需要继承该基类并且实现run函数即可。
基类的定义如下:
在线程的回调函数中,只是转掉函数Run。这样设计的原因是因为在C++的回调函数必须是全局函数或者是静态成员函数,否则编译不会通过。而全局函数没有虚函数一说,也没有继承一说(静态函数也没有,静态函数只是限制了作用域的全局函数)。Start函数与线程的回调函数实现如下:
总结:这样设计以后,程序中如果需要其它使用其它线程,可以继承该基类,然后实现Run函数即可。如果需要线程等待等操作则需要在里面添加内容。
1、线程类中应该包含线程ID、线程的状态以及线程基本操作等。
2、线程需要的基本操作都差不多,唯一不同的是线程执行的函数体。因此大多数操作都可以写在基类中,当需要使用线程时,只需要继承该基类并且实现run函数即可。
基类的定义如下:
/*线程基类,封装了线程常用的操作,以后需要使用线程时,只需要继承该类并实现Run函数既可*/ class CThread { public: /*如果不需要为线程传参数,则可以使用这个构造函数*/ CThread() { m_ThreadId = 0; m_iThreadStatus = 0; m_vpParameter = NULL; } /*重载构造函数,该构造函数可以为线程传参数*/ CThread(void *vpParameter) { m_ThreadId = 0; m_iThreadStatus = 0; m_vpParameter = cpParameter; } virtual ~CThread(); /*线程的启动函数,在该函数中将会创建线程*/ int Start(void *Parameter); /*线程的回调函数,在该函数中只是转调run函数*/ static void *ThreadCall(void *vpParameter); /*获取线程ID*/ pthread_t GetThreadId() { return this->m_ThreadId; } /*获取线程状态*/ int GetThreadStatus() { return m_iThreadStatus; } /*获取线程状态*/ int GetThreadStatus(); /*线程真正工作的函数,这个函数需要在派生类中实现*/ virtual void *Run(void *Parameter) = 0; protected: //线程的Id号 pthread_t m_ThreadId; //线程状态 int m_iThreadStatus; //线程参数 void* m_vpParameter; }; inline pthread_t CThread::GetThreadId() { return this->m_ThreadId; }
在线程的回调函数中,只是转掉函数Run。这样设计的原因是因为在C++的回调函数必须是全局函数或者是静态成员函数,否则编译不会通过。而全局函数没有虚函数一说,也没有继承一说(静态函数也没有,静态函数只是限制了作用域的全局函数)。Start函数与线程的回调函数实现如下:
int CThread::Start(void *vpParameter) { int ret = pthread_create(&(this->m_ThreadId), NULL, CThread::ThreadCall, vpParameter);//该函数中创建线程 if(0 == ret) { return TRUE; } return FAULT; } void *CThread::ThreadCall(void *vpParameter)//线程回调函数 { void *vpRet; CThread *pObj = static_cast<CThread *>(vpParameter);//将指针强制性转化成对象 vpRet = pObj->Run(m_vpParameter);//调用线程正在执行的函数 return vpRet; };
总结:这样设计以后,程序中如果需要其它使用其它线程,可以继承该基类,然后实现Run函数即可。如果需要线程等待等操作则需要在里面添加内容。
相关文章推荐
- 产看Linux运行时间
- cheng@Linux之基础--存储器管理实验
- centos、debian下安装开发者工具包
- linux挂载windows上的共享文件夹
- chmod
- Linux常用解缩压
- Linux系统下awk命令使用
- linux iptables 防火墙
- Linux chmod命令详解
- [实验]linux虚拟机不进单用户重置密码
- 【Linux应用层】防火墙iptables命令
- Linux 下 socket 高并发分析与优化
- linux设备驱动归纳总结(十):1.udev&misc 2
- Java问题排查常用linux命令
- 在linux系统下搭建SVN服务器
- CentOS7 关闭防火墙
- Linux kernel多线程的几种实现
- linux常用命令
- ambarella s2l11m linux device_initcall
- linux grep 命令