加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.zhandada.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

多线程类的封装

发布时间:2022-10-15 22:31:10 所属栏目:Unix 来源:未知
导读: 对与一个c++后台程序员来说, 多线程肯定是会用到的, 一般情况下都是封装已经写好的pthread库成为一个新的类, 然后在程序中使用。这篇文章的主要目的就是把平时工作中用到的多线程类的方

对与一个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)

{

}

// 初始化线程属性unix线程切换, 设置优先级

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";

}

这个可能以后还需要修改, 或者需求变了, 或者有更清晰的思路, 所以这只是个静态的, 软件是一个过程, 这只是一个缩影。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章