首页 > 编程语言 >一个C++的 线程基类

一个C++的 线程基类

时间:2024-09-03 23:03:57浏览次数:6  
标签:std stopFlag thread lock void C++ 线程 基类 mutex

 

 

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>

class ThreadBase {
public:
    ThreadBase() : thread_(nullptr), stopFlag_(false) {}
    
    virtual ~ThreadBase() {
        stop();
    }

    // 启动线程
    void start() {
        std::lock_guard<std::mutex> lock(mutex_);
        if (!thread_) {
            stopFlag_ = false;
            thread_ = new std::thread(&ThreadBase::run, this);
        }
    }

    // 停止线程
    void stop() {
        {
            std::lock_guard<std::mutex> lock(mutex_);
            if (thread_) {
                stopFlag_ = true;
                cv_.notify_all();
            }
        }
        
        if (thread_ && thread_->joinable()) {
            thread_->join();
        }

        {
            std::lock_guard<std::mutex> lock(mutex_);
            delete thread_;
            thread_ = nullptr;
        }
    }

protected:
    // 子类需要实现的业务逻辑
    virtual void threadFunction() = 0;

    // 判断线程是否需要停止
    bool shouldStop() const {
        return stopFlag_.load();
    }

    // 等待指定时间(毫秒)
    void waitFor(int milliseconds) {
        std::unique_lock<std::mutex> lock(mutex_);
        cv_.wait_for(lock, std::chrono::milliseconds(milliseconds), [this] { return stopFlag_.load(); });
    }

private:
    void run() {
        while (!shouldStop()) {
            threadFunction();
        }
    }

    std::thread* thread_;
    std::mutex mutex_;
    std::condition_variable cv_;
    std::atomic<bool> stopFlag_;
};


class MyThread : public ThreadBase {
protected:
    void threadFunction() override {
        // 模拟执行一些任务
        std::cout << "MyThread is running..." << std::endl;

        // 模拟任务执行时间
        waitFor(1000);

        // // 可选择在某个条件下停止
        // if (/* some condition */) {
        //     stop();  // 手动停止线程
        // }
    }
};

int main() {
    MyThread myThread;
    myThread.start();

    std::this_thread::sleep_for(std::chrono::seconds(5)); // 主线程等待一段时间

    myThread.stop();  // 停止子线程
    return 0;
}

 

标签:std,stopFlag,thread,lock,void,C++,线程,基类,mutex
From: https://www.cnblogs.com/music-liang/p/18395618

相关文章

  • 二、并发编程与多线程-2.1、J.U.C和锁(下篇)
    2.1、J.U.C和锁(下篇)2.1.8、什么是可重入锁?它的作用是什么?答:在Java中,可重入锁是一种同步机制,它允许同一个线程多次获取同一个锁。当一个线程持有该锁时,它可以反复进入被该锁保护的代码块,而不会被阻塞。这种机制也被称为递归锁。比如synchronized锁和ReentrantLock锁都是可......
  • 多线程、任务、异步的区别
    Task和Thread的区别这是一个高频,深刻的问题,无论去哪都逃不过被询问这个问题。Task是基于Thread的,这是众所周知的。但是Task和Thread的联系如此简单和纯粹确实我没想到的。甚至只需要几十行代码就能呈现其原理。一个简单的模拟实例说明Task及其调度问题,这真是一篇好文章。任务体......
  • C语言零基础入门教程——02 C语言开发环境的配置(Dev C++超详细安装教程)
    文章目录前言DevC++安装一、软件介绍二、软件下载三、软件安装结语前言编写代码一般需要在特定的工具即集成开发环境(IDE)上进行,它可以帮助程序员更高效地编写一些程序,因此在编写程序之前,我们需要安装相应的开发工具从而配置开发环境,考虑到高校教学都广泛使用DevC+......
  • c++实现生产者&消费者的供需关系
    一、生产者&消费者模式生产者-消费者模式(Producer-ConsumerPattern)是一种常见的并发设计模式,这种模式最常见,所以把它单独拿出来,这种模式用于处理生产者和消费者之间的协调问题。生产者和消费者之间不直接关联或依赖,而是用一个第三方来协调双方的供需关系。这种模式解决了生产......
  • Linux C++ 开发7 - GDB常用命令汇总(你想了解的都在这)
    1.运行命令2.设置断点3.查看源码4.打印表达式5.查看运行信息5.1.设置和查看运行参数的Demo6.分割窗口7.参考文档上一篇《LinuxC++开发6-GDB调试》中我们讲解了GDB的调试流程和常用的调试方法。GDB的调试指令众多,我们这里针对常用的指令做一个汇总(按功能......
  • Linux C++ 开发7 - GDB常用命令汇总(你想了解的都在这)
    1.运行命令2.设置断点3.查看源码4.打印表达式5.查看运行信息5.1.设置和查看运行参数的Demo6.分割窗口7.参考文档上一篇《LinuxC++开发6-GDB调试》中我们讲解了GDB的调试流程和常用的调试方法。GDB的调试指令众多,我们这里针对常用的指令做一个汇总(按功能分......
  • 【C++】_vector定义、_vector常用方法解析
    不管心情如何,不论今天过得怎么样,无论身在何方,请记得...微笑!......
  • C++STL
    1.1STL初识STL(StandardTemplateLibrary,标准模板库)STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)容器和算法之间通过迭代器进行无缝连接STL几乎所有代码都采用了模板类或者模板函数1.2STL六大组件STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器......
  • c++
    1 C++概述1.1 C++两大编程思想1.1.1 面向对象  泛型编程1.2 C++98标准2 C++书写helloworld2.1 包含头文件  #include<iostream>标准输入输出头文件2.2 usingnamespacestd;使用标准命名空间2.3 cout<<“helloworld”<<endl; endline;2.4 面向对象三大特......
  • (D卷,100分)- 堆栈中的剩余数字(Java & JS & Python&C&C++)
    题目描述向一个空栈中依次存入正整数,假设入栈元素n(1<=n<=2^31-1)按顺序依次为nx…n4、n3、n2、n1,每当元素入栈时,如果n1=n2+…+ny(y的范围[2,x],1<=x<=1000),则n1~ny全部元素出栈,重新入栈新元素m(m=2*n1)。如:依次向栈存入6、1、2、3,当存入6、1、2时,栈底......