【Linux系统】线程:C++线程封装(简化线程操作)




在这里插入图片描述



C++ 线程封装:简化线程操作

在现代软件开发中,多线程编程变得越来越重要。它能够充分利用多核处理器的优势,提高程序的执行效率。然而,直接使用POSIX线程(pthread)进行编程可能显得有些复杂和繁琐。本文将介绍一个简单的C++线程类封装,旨在简化线程的创建、启动、停止和管理过程。

一、设计理念

为了提供一个更加友好和直观的接口来处理线程,我们设计了一个名为Thread的类。该类不仅隐藏了底层的pthread实现细节,还提供了如状态管理、自动命名等功能,使得开发者可以专注于业务逻辑而非线程管理本身。

二、主要特性

1. 状态管理

Thread类通过枚举类型THREAD_STATE来表示线程的不同状态,包括新建(NEW)、运行(RUNNING)和停止(STOP)。这有助于清晰地了解线程在其生命周期内的状态变化。

2. 自动命名

每个线程都会自动生成一个唯一的名称(例如:“thread-1”, "thread-2"等),这有助于调试和日志记录时区分不同的线程。

3. 可选的分离模式

通过Detach()方法,线程可以被设置为分离状态,这意味着它们将在结束时自动释放资源,而不需要显式的调用Join()来回收资源。

4. 安全的启动与停止

提供Start()Stop()方法来安全地启动和请求停止线程,确保线程能够在适当的时机开始或终止其执行。


三、成员函数详解

构造函数

Thread(func_t func) : _func(func), _joinable(true), _status(THREAD_STATE::NEW)
{
   
    _name = "thread-" + std::to_string(num++); // 自动命名线程
    _pid = getpid(); // 获取当前进程ID
}
  • 功能:初始化线程对象,并为线程设置默认状态为新建(NEW)。同时,自动生成唯一的线程名称和获取当前进程ID。

Start()

bool Start()
{
   
    if (_status == THREAD_STATE::NEW)
    {
   
        // 创建线程
        int ret = pthread_create(&_tid, nullptr, Runtine, this);
        if (ret != 0)
            return false;

        _status = THREAD_STATE::RUNNING;
    }
    return true;
}

  • 功能:启动线程。首先检查线程是否处于新建状态(NEW),如果是,则调用pthread_create创建新线程。
  • POSIX方法
    • pthread_create: 用于创建一个新线程,该函数接受线程ID、线程属性(这里为默认值nullptr)、线程运行的函数及其参数。在这个例子中,我们使用了静态成员函数Runtine作为入口点,并将当前对象(this)作为参数传递给它,以确保可以访问成员变量和函数。

关于 Start 函数中, pthread_create 传递 this 的用意和思路可以点击跳转看这里点击跳转


Stop()

bool Stop()
{
   
    if (_status == THREAD_STATE::RUNNING)
    {
   
        // 取消线程
        int ret = pthread_cancel(_tid);
        if (ret != 0)
            return false;
        _status = THREAD_STATE::STOP;
    }
    return true;
}
  • 功能:请求停止线程。如果线程正在运行,通过pthread_cancel发送取消请求来终止线程。
  • POSIX方法
    • pthread_cancel: 发送一个取消请求到指定的线程。需要注意的是,这个函数并不保证立即终止线程,具体行为取决于线程的取消状态和类型。

Join()

bool Join()
{
   
    if (_joinable &&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值