Linux线程封装(c++)

Linux线程封装(c++)

1. 前言

c++对Linux的 pthread.h库进行了封装,使我们能以类和对象的形式创建和管理线程。本篇将模拟c++封装 pthread.h库的线程相关函数,使我们也能在外部以类和对象的形式创建和管理线程。

2. 代码实现

2.1 成员变量、构造函数

#pragma once
#include 
#include 
#include 

using func_t = std::function;
class Thread
{
public:
    Thread(const std::string &name, func_t func) : _name(name), _func(func) {}
    
private:
    std::string _name;
    pthread_t _tid;
    bool _isrunning;
    func_t _func; // 线程要执行的回调函数
};

为方便管理,我为线程设置了 std::string _name成员变量,好在实际使用中可以为线程自定义名字。

pthread_t _tid是线程id的声明,其类型定义为unsigned long int

bool _isrunning用于程序判断线程是否正在运行。

func_t _func是用包装器包装了一个返回值为void,参数为string的func函数。

2.2线程运行函数

我将控制线程运行的函数分为三个函数 Excute()控制内部成员变量的值,Start()调用 pthread.h库原生的 pthread_create()来创建Linux环境的线程,ThreadRoutine()是一个静态成员函数,所有的新线程都会执行这唯一的一个函数,它用于作为pthread_create()需要的回调函数使用。

#pragma once
#include 
#include 
#include 

using func_t = std::function;

class Thread
{
public:
    void Excute()
    {
        _isrunning = true;
        _func(_name);
        _isrunning = false;
    }
    static void *ThreadRoutine(void *args)
    {
        Thread *self = static_cast(args); // 获得当前对象,agrs是this
        self->Excute();                             // 执行线程
        return nullptr;                             // 为防止出现无匹配返回值编译错误
    }

    bool Start()
    {
        int n = pthread_create(&_tid, nullptr, ThreadRoutine, this);
        if (n != 0)
            return false;
        return true;
    }
};

2.3 其他函数

线程的取消、join,以及获取自己给线程取的名字,都作为函数进行了实现。

#pragma once
#include 
#include 
#include 

class Thread
{
public:
    std::string Status()
    {
        if (_isrunning)
            return "running";
        else
            return "seelp";
    }

    void Stop()
    {
        if (_isrunning)
        {
            _isrunning = false;
            pthread_cancel(_tid);
        }
    }

    void Join()
    {
        pthread_join(_tid, nullptr);
    }

    std::string Name()
    {
        return _name;
    }
private:
    std::string _name;
    pthread_t _tid;
    bool _isrunning;
    func_t _func; // 线程要执行的回调函数
};

你可能感兴趣的:(linux,c++,java)