CPP线程管理类实现

一个线程管理模块应该包含Task(任务类)、Thread(线程类)、线程管理类(ThreadManager)。

cpp 复制代码
#pragma once
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
#include <queue>
#include <functional>
#include <condition_variable>

typedef std::function<void(void*)> ThreadTaskFun;

// 任务类
class Task {
public:
  Task(ThreadTaskFun, void* param = nullptr) : func_(std::move(func)), taskParams(param){}
  Task() {}

  void execute() {
    if (func_) {
      func_(taskParams);
    }
  }

private:
  std::function<void(void*)> func_;
  void* taskParams;
};

// 线程类
class Thread {
public:
  Thread() : thread_(), active_(false) {}

  void start() {
    active_ = true;
    thread_ = std::thread([this]() {
      while (active_) {
        Task task;
        {
          std::unique_lock<std::mutex> lock(mutex_);
          // 等待任务队列不为空
          condition_.wait(lock, [this]() { return !tasks_.empty() || !active_; });
          if (!active_) {
            break;
          }
          task = std::move(tasks_.front());
          tasks_.pop();
        }
        task.execute();
      }
    });
  }

  void stop() {
    if (active_) {
      active_ = false;
      condition_.notify_one();
      if (thread_.joinable()) {
        thread_.join();
      }
    }
  }

  void addTask(Task task) {
    std::lock_guard<std::mutex> lock(mutex_);
    tasks_.push(std::move(task));
    condition_.notify_one();
  }

private:
  std::thread thread_;
  std::queue<Task> tasks_;
  std::mutex mutex_;
  std::condition_variable condition_;
  bool active_;
};

// 线程管理类
class ThreadManager {
public:
  ThreadManager(int num_threads) {
    for (int i = 0; i < num_threads; ++i) {
      threads_.emplace_back(std::make_unique<Thread>());
    }
  }

  ~ThreadManager()
  {
    stopThreads();
  }

  void startThreads() {
    for (auto& thread : threads_) {
      thread->start();
    }
  }

  void stopThreads() {
    for (auto& thread : threads_) {
      thread->stop();
    }
  }

  void addTask(Task task) {
    if (index_ >= threads_.size()) {
      index_ = 0; // 循环使用线程
    }
    threads_[index_]->addTask(std::move(task));
    index_++;
  }

private:
  std::vector<std::unique_ptr<Thread>> threads_;
  int index_ = 0;
};

Demo

cpp 复制代码
#include "threadpool.h"

class Resources
{
public:
  Resources()
  {
    resourcesThreadFun = std::bind(&Resources::exampleTaskFunction, this, std::placeholders::_1);
  }
  void exampleTaskFunction(void* param) {
    int index = 0;
    std::cout << "Executing task " << index << " in thread: " << std::this_thread::get_id() << std::endl;
  }

  ThreadTaskFun resourcesThreadFun;

};

int main() {
  ThreadManager manager(4); // 创建4个线程
  manager.startThreads();

  Resources* pResource = new Resources();
  

  // 添加10个示例任务
  for (int i = 0; i < 100; ++i) {
    Task task(pResource->resourcesThreadFun);
    manager.addTask(std::move(task));
  }

  std::cout << "main thread over!" << std::endl;

  return 0;
}
相关推荐
南郁6 小时前
007-nlohmann/json 项目应用-C++开源库108杰
c++·开源·json·nlohmann·现代c++·d2school·108杰
菠萝018 小时前
共识算法Raft系列(1)——什么是Raft?
c++·后端·算法·区块链·共识算法
海棠蚀omo8 小时前
C++笔记-C++11(一)
开发语言·c++·笔记
凌佚9 小时前
rknn优化教程(一)
c++·目标检测·性能优化
Lenyiin11 小时前
《 C++ 点滴漫谈: 四十 》文本的艺术:C++ 正则表达式的高效应用之道
c++·正则表达式·lenyiin
yxc_inspire13 小时前
基于Qt的app开发第十三天
c++·qt·app·tcp·面向对象
虾球xz13 小时前
CppCon 2015 学习:Concurrency TS Editor’s Report
开发语言·c++·学习
潇-xiao13 小时前
Qt 按钮类控件(Push Button 与 Radio Button)(1)
c++·qt
板鸭〈小号〉13 小时前
命名管道实现本地通信
开发语言·c++
YKPG15 小时前
C++学习-入门到精通【14】标准库算法
c++·学习·算法