您的位置:首页 > 运维架构 > Linux

linux下C++对线程的封装

2015-11-23 20:36 615 查看
之前一直是使用C语言,前段时间转做C++。无论使用什么语言,多线程编程都是不可或缺的。最近项目中又用到了线程,现在将线程的封装做出总结:

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函数即可。如果需要线程等待等操作则需要在里面添加内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: