c++学习:用多态来写线程类,实战

目录

原本用c写的线程

改成用c++的类封装线程进行使用

用多态来优化

线程任务函数

线程基类

时间线程类

主函数

讲解


原本用c写的线程

#include 

using namespace std;

void *task(void *arg)
{
    int cnt=0;
    while(1)
    {
        ::sleep(1);
        cont<

改成用c++的类封装线程进行使用

#include 
#include 

using namespace std;

void *task(void *arg)
{
    int cnt=0;
    while(1)
    {
        ::sleep(1);
        cont<

如果要多个线程就要多个任务,就很难管理,

用多态来优化

把最基础的线程作为基类,拿计算时间的类继承线程基类来创建线程

线程任务函数

//会将派生类的地址传进来用线程基类指针接收,最后运行派生类里重写的run函数
void*task(void*arg)
{
    //基类指针指向的是派生类对象
    Thread *th = (Thread*)arg;
    th->run();
}

线程基类

class Thread{
public:
    Thread(){}
    ~Thread(){}

    void start()
    {
        pthread_create(&th,NULL,task,this);//创建线程
        pthread_detach(th);//线程主动与主控线程断开关系,不会产生僵尸线程
    }
    void stop()
    {
        pthread_cancel(th);//停止线程
    }
    //函数里写线程里原本运行的代码  虚函数
    virtual void run()
    {

    }
private:
    pthread_t th;
};

时间线程类

class TimeThread:public Thread
{
public:
    TimeThread(){}
    //重写基类里的run函数
    virtual void run() override
    {
        int cnt=0;
        while(1){
            sleep(1);
            std::cout<

主函数

int main()
{
   TimeThread t1;
   //因为时间类没有重写start函数,所以会调用基类的start函数进行创建线程
   t1.start(); //等价于t1.start(&t1);

   sleep(10);
   //因为时间类没有重写stop函数,所以会调用基类的stop函数进行停止线程
   t1.stop();

   while(1);
   return 0;
}

后面我们要启动线程的时候就可以新建一个类,继承线程类,重写run函数就可以调用了,方便省事

讲解

在基类里的start函数里的pthread_create(&th,NULL,task,this);这句话,里面的this意思是把本身的地址当做参数传进线程任务函数里,在线程任务函数里拿基类的数据类型指针进行接收,再调用run函数,又因为基类里的run函数是虚函数,会生成一个虚函数表,我们再新建时间类的时候从写了run函数,就将虚函数表里的基类run函数地址替换成了时间类的run函数地址,自然在线程任务函数里调用的run函数就是我们新建的时间类的里的run函数了

你可能感兴趣的:(c++,c++,学习,开发语言)