对与一个c++后台程序员来说, 多线程肯定是会用到的, 一般情况下都是封装已经写好的pthread库成为一个新的类, 然后在程序中使用。这篇文章的主要目的就是把平时工作中用到的多线程类的方法记录下来, 或许以后可能会用到, 那样就不用重头来过了, 呵呵
//zthread.h
class ZBaseThread
{
public:
ZBaseThread();
virtual ~ZBaseThread();
/* 运行线程
* @param policy 调度策略: 可以选择:
* SCHED_OTHER->缺省调度策略
* SCHED_FIFO->实时调度, 只有主动释放资源时或者更高优先级线程启动时才切换
* SCHED_RR-> 实时调度, 对相同优先级的线程采用时间片轮询方式调度
* @param priority 优先级, 只有当调度策略为fifo或者rr时才生效
* @return true/false
*/
virtual bool RunThread( bool bCreateDetach = false, zint32 Policy = SCHED_OTHER, zint32 Priority = 0);
/*
* 设置线程运行参数, 可以实现实时调整线程优先级
* @param Policy 调度 策略
* @param priority 优先级
* @return true/false
*/
virtual bool SetThreadParam( zint32 Policy, zint32 Priority );
/*
*等待线程退出
*/
virtual void WaitThreadExit();
/*
* 获取线程类型信息
* @return 线程类型
*/
virtual std::string GetTreadType();
protected:
/* 由继承类调用的纯虚函数, 处理实际线程 */
virtual void OnThreadProc() = 0;
static void * ZThreadRunTimeFunc( void * pParams);
zuint32 m_RunningCounter;
pthread_t m_hThread;
};
// zthread.cpp
using namespace std;
ZBaseThread::ZBasetThread()
: m_RunningCounter(0)
, m_hThread(0)
{
}
ZBaseThread::~ZBaseThread()
{
if (m_hThread != 0)
{
}
}
bool ZBaseThread::RunThread(bool bCreateDetach, zint32 Policy, zint32 Priority)
{
zint32 retval;
if (m_hThread != 0)
{
}
// 初始化线程属性, 设置优先级
pthread_attr_t thread_attr;
pthread_attr_init( & thread_attr);
if ( bCreateDetach)
{
//设置为unjoinable
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
}
if (Policy != SCHED_OTHRE)
{
shed_param sp;
pthread_attr_setschedpolicy(&thread_attr, Policy);
sp.sched_policy = Priority;
pthread_attr_setschedparam(&thread_attr, &sp);
}
retval = pthread_create(&m_hThread, &thread_attr, ZThreadRunTimeFunc, this);
pthread_attr_destory(&thread_attr);
if ( retval != 0 )
{
return false;
}
}
bool ZBaseThread::SetThreadParam( zint32 Policy, zint32 Priority )
{
sched_param sp;
sp.sched_priority = Priority;
pthread_setschedparam(m_hThread, Policy, &sp);
return true;
}
void ZBaseThread::WaitThreadExit()
{
if (m_hThread != 0)
{
void * retval = NULL;
pthread_join( m_hThread, &retval);
m_hThread = 0;
}
else
{
}
}
void * ZBaseThread::ZThreadRunTimeFun(void *pParam)
{
// 这估计是这个类最精华的地方了
ZBaseThread * This = (ZBaseThread *)pParams;
This->OnThreadProc();
return NULL;
}
string ZBaseThread::GetThreadType()
{
return "BASE_THREAD";
}
这个可能以后还需要修改, 或者需求变了, 或者有更清晰的思路, 所以这只是个静态的, 软件是一个过程, 这只是一个缩影。
阅读(2557) | 评论(0) | 转发(0) |