把Linux 的线程操作封装在类里面

大家知道,Linux的线程操作是使用pthread库。这个库都是c函数,如果你使用c++语言开发的话,线程处理部分不能封装起来是一个很麻烦的事情,从面向对象角度,系统结构等角度来看都很不舒服。我曾经找过是否有别人编写的c++的线程处理库,但是没有找到。于是我自己写了一个,希望能对大家有点用处。当然也可能存在问题,希望大家指出。我的信箱是 hezhenwei#hotmail.com
点这里下载

使用方法:
    把thread-1.0-1.i386.rpm安装到你机器上。
   创建一个class , public 继承 Thread 类。需要包含的头文件是 <thread.h>
   重载 virtual void Routine(void) 方法,写入你的线程所要做的事情。
   运行时,只要使用对象的Run方法。该方法立即返回。同时已经有一个线程在运行了。

下面讲讲主要的思路:
   建立一个class 叫做 Thread。然后建立方法Routine和Run。
   在同一个文件中建立一个线程。
   在Run方法中创建该线程,同时把本身的对象指针 this 作为参数传递给线程
   在线程中调用this指针的Routine方法。
    以上就可以把一个线程封装在类Thread中了。
   然后我把Routine方法作为虚函数,这样该类的子类就可以重载该方法以实现不同的线程操作。

主要代码如下
thread.h文件
None.gif #ifndef _THREAD_H_HEZHENWEI_ASDFASDF
None.gif
#define  _THREAD_H_HEZHENWEI_ASDFASDF
None.gif#include 
< pthread.h >
None.gif
void *  thd( void *  pars);
None.gif
class  Thread
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
private:
InBlock.gif    pthread_t m_tht;
InBlock.gif    
int m_nPid;
InBlock.gif
public:
InBlock.gif    
void SetPid(const int nPid);
InBlock.gif    
int GetPid(void);
InBlock.gif    
void run(void);
InBlock.gif    
virtual void Routine(void);
InBlock.gif    
bool isRunning(void);
ExpandedBlockEnd.gif}
;
None.gif
None.gif
#endif

thread.cpp文件
None.gif
None.gif
None.gif#include 
< stdio.h >
None.gif#include 
< sys / types.h >
None.gif#include 
< unistd.h >
None.gif#include 
< signal.h >
None.gif#include 
" thread.h "
None.gif
void *  thd( void *  pars)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    Thread
* p1;
InBlock.gif    p1
=(Thread*)pars;
InBlock.gif    
int nPid = getpid();
InBlock.gif    p1
->SetPid(nPid);
InBlock.gif    p1
->Routine();    
InBlock.gif    
return NULL;
ExpandedBlockEnd.gif}

None.gif
None.gif
void  Thread::run( void )
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    pthread_create(
&m_tht,NULL,&thd,(void*)this);
ExpandedBlockEnd.gif}

None.gif
None.gif
void  Thread::Routine( void )
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    printf(
"thread is running\n");
ExpandedBlockEnd.gif}

None.gif
None.gif
void  Thread::SetPid( int  nPid)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    m_nPid 
= nPid;
ExpandedBlockEnd.gif}

None.gif
None.gif
int  Thread::GetPid( void )
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
return m_nPid;
ExpandedBlockEnd.gif}

None.gif
None.gif
bool  Thread::isRunning( void )
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int nRet;
InBlock.gif    nRet 
= kill(m_nPid,SIGCHLD);
InBlock.gif    
if(0!=nRet)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return false;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
else
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return true;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif    
None.gif


转载于:https://www.cnblogs.com/hezhenwei/archive/2005/03/24/124990.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值