Chinaunix首页 | 论坛 | 博客
  • 博客访问: 443737
  • 博文数量: 138
  • 博客积分: 4114
  • 博客等级: 上校
  • 技术积分: 1341
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-14 20:41
文章分类

全部博文(138)

文章存档

2014年(1)

2013年(2)

2012年(78)

2011年(13)

2010年(34)

2009年(10)

我的朋友

分类: LINUX

2010-05-13 14:20:34

对与一个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";
}

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

阅读(2535) | 评论(0) | 转发(0) |
0

上一篇:this bug

下一篇:不要一辈子靠技术生存

给主人留下些什么吧!~~