linux下 C++ 封装一个简洁管理方便线程类

7 篇文章 0 订阅
1 篇文章 0 订阅

最近换了工作,发现旧代码使用直接使用linux api 线程API 代码难阅读而且管理不方便于是重新封装了一个线程类,不说那些多直接贴代码

thread.cpp

#include "thread.h"
void *threadBase::threadFun(void *arg){
    threadBase *p = (threadBase *)arg;
    while(!p->threadIsExit()){
       if(!p->threadLoop()){
            p->threadExit();
            break;
       }

       if(p->threadIsStop()){
            p->waitCond();
       }
    }
    p->threadEnd();
    return p;
}

void threadBase::run(){
    printf("run in\n");
    readyToRun();
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);
    state = THREAD_RUNNING;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr,	PTHREAD_CREATE_DETACHED);
    pthread_create(&tid, &attr, threadFun, this);
    pthread_detach(tid); 
    printf("run out\n");
}

void threadBase::threadExit(){
    state = THREAD_EXIT;
    printf("threadExit \n");
}

bool threadBase::threadIsExit(){
    if(state == THREAD_EXIT){
        return true;
    }
    return false;
}

bool threadBase::threadIsStop(){
    if(state == THREAD_STOP){
        return true;
    }
    return false;
}

void threadBase::threadStop(){
    printf("threadStop \n");
    if(state == THREAD_RUNNING){
        state = THREAD_STOP;
    }
}

void threadBase::threadRerun(){
    if(state == THREAD_STOP){
        state = THREAD_RUNNING;
        sendCond();
    }
}



void threadBase::readyToRun(){
    printf("readyToRun\n");
}

void threadBase::readyToEnd(){
    printf("readyToEnd\n");
}

void threadBase::threadEnd(){
    readyToEnd();
    pthread_mutex_destroy(&mutex);	//销毁
    pthread_cond_destroy(&cond);	//销毁
    pthread_attr_destroy(&attr);
    printf("threadEnd out\n");
}

void threadBase::sendCond(){
    printf("sendCond in\n");
    pthread_cond_signal(&cond);//向条件变量发送信号
    printf("sendCond out\n");
}

void threadBase::waitCond(){
    printf("waitCond in\n");
    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&cond, &mutex);
    pthread_mutex_unlock(&mutex);
    printf("waitCond out\n");
}

thread.h


#ifndef __THREAD_H__ 
#define __THREAD_H__ 

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
using namespace std;
enum {
    THREAD_START = 0,
    THREAD_RUNNING,
    THREAD_STOP,
    THREAD_EXIT,
    THREAD_END
};

class threadBase{
    public:
        threadBase(){

        };
        int state = THREAD_START;
        virtual bool threadLoop() = 0;
        void run();
        void threadRerun();
        void threadStop();
        void threadExit();
        bool threadIsExit();
        bool threadIsStop();
    private:
        
        pthread_t tid;
        pthread_attr_t attr;

        pthread_mutex_t mutex  = PTHREAD_MUTEX_INITIALIZER; //定义互斥锁
        pthread_cond_t cond = PTHREAD_COND_INITIALIZER; //定义条件变量
        
    
        virtual void readyToRun();
        virtual void readyToEnd();

        static void *threadFun(void *arg);
        
        
        
        
        void threadEnd();
        
        void sendCond();
        void waitCond();
};




#endif /*__THREAD_H__*/

main.cpp

#include "thread.h"
#include <stdio.h>
using namespace std;

class test : public threadBase{//使用只需继承即可
   
   public:
   test(){

   };
   int i=0;
   bool threadLoop(){//线程循环
      i++;
      printf(" %d \n",i);
      usleep(20000);
      return true;
   }
   private:
    void readyToRun(){//线程开启前准备动作
        printf("readyToRuni\n");
    }
     void readyToEnd(){//线程结束准备动作
        printf("readyToEnd\n");;
     }
};

int main(){
   unsigned int i = 1;
   test *t = new test();
   t->run();
   while(!t->threadIsExit()){
      if(i==100){
         t->threadStop();
      }
      if(i == 200){
         t->threadRerun();
      }
      usleep(10000);
      i++;
      if(i==1000){
         t->threadExit();
      }
   }
   usleep(20000);
   delete t;
   return 0;
}

编译:g++ main.cpp thread.cpp -lpthread

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hmbbPdx_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值