21xrx.com
2025-03-30 19:14:58 Sunday
文章检索 我的文章 写文章
C++实现线程池:从原理到代码实现
2023-07-04 15:03:19 深夜i     14     0
C++ 线程池 原理 代码实现

随着互联网技术的不断发展,在网络应用程序中,线程池作为一种常用的技术手段,被广泛应用于服务器端的开发。线程池可以有效地避免资源的浪费和线程创建销毁带来的性能开销,提高处理并发请求的效率。本文将深入探讨线程池的原理以及如何使用 C++语言实现。

一、线程池的原理

线程池本质上是一种线程管理机制,它主要包括以下几个部分:

1.任务队列:用于存储待执行的任务,它可以是一个队列或者一个堆栈。

2.工作线程队列:用于存储存在的工作线程,这些工作线程会不断地从任务队列中获取任务并执行。

3.线程池管理器:用于管理工作线程的生命周期和任务队列的长度。

线程池的工作流程如下:

1.线程池初始化:创建若干个工作线程,将它们放到工作线程队列中,并且设置它们的状态为“等待任务”。

2.任务的接收和分发:当有新的任务到达时,线程池管理器会把它放到任务队列中。工作线程会不断地从任务队列中取出任务,并执行相应的操作。

3.任务的执行:当工作线程从任务队列中取出任务时,它会将自己的状态设置为“忙碌”,并开始执行任务。当一个任务执行完毕后,工作线程将自己的状态重新设置为“等待任务”,并等待下一个任务的到来。

4.线程池的关闭:当线程池不再需要工作线程时,线程池管理器会指示每个工作线程退出。

二、线程池的实现

以下是用 C++语言实现线程池的示例代码:

#include <iostream>
#include <vector>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
// 定义任务结构体
struct Task {
  void (*func)(int);
  int arg;
};
// 定义线程池类
class ThreadPool {
public:
  ThreadPool(int num);
  void addTask(Task task);
  bool getTask(Task& task);
  void stop();
private:
  int numThreads; // 工作线程数量
  vector<thread> threads; // 工作线程列表
  queue<Task> taskQueue; // 任务队列
  mutex queueMutex; // 任务队列互斥锁
  condition_variable cv; // 条件变量
  bool isStop; // 关闭标志
};
ThreadPool::ThreadPool(int num):numThreads(num),isStop(false) {
  for(int i = 0; i < numThreads; i++) {
    threads.emplace_back([this] () {
      Task task;
      while(!this->isStop) {
        // 获取任务
        if(this->getTask(task)) {
          // 执行任务
          task.func(task.arg);
        }
      }
    });
  }
}
// 添加任务
void ThreadPool::addTask(Task task) {
  unique_lock<mutex> lock(queueMutex);
  taskQueue.push(task);
  cv.notify_one();
}
// 获取任务
bool ThreadPool::getTask(Task& task) {
  unique_lock<mutex> lock(queueMutex);
  cv.wait(lock, [this]() {
    return this->isStop || !this->taskQueue.empty();
  });
  if(this->isStop) {
    return false;
  }
  task = std::move(taskQueue.front());
  taskQueue.pop();
  return true;
}
// 关闭线程池
void ThreadPool::stop() {
  {
    unique_lock<mutex> lock(queueMutex);
    isStop = true;
  }
  cv.notify_all();
  for(thread& worker:threads) {
    if(worker.joinable()) {
      worker.join();
    }
  }
}
void testFunc(int arg) {
  cout << "task " << arg << " is running" << endl;
  this_thread::sleep_for(chrono::milliseconds(100));
  cout << "task " << arg << " is finished" << endl;
}
int main() {
  ThreadPool pool(4);
  for(int i = 0; i < 10; i++) {
    Task task{&testFunc, i};
    pool.addTask(task);
  }
  pool.stop();
  return 0;
}

以上代码实现了一个简单的线程池,其中包括了任务队列、工作线程队列和线程池管理器。我们在 main 函数中创建了 10 个任务,并将它们添加到任务队列中。线程池会自动创建 4 个线程,这些线程会从任务队列中取出任务并执行。当所有的任务执行完毕后,我们通过调用 stop 函数来关闭线程池。

总结

线程池是一种常用的技术手段,可以有效地提高服务器端的并发处理能力。本文我们探讨了线程池的原理以及如何使用 C++语言来实现一个简单的线程池。在实际使用中,我们需要根据具体的应用场景和需求来选择合适的线程池实现方案。

  
  

评论区

请求出错了