21xrx.com
2024-11-22 07:28:47 Friday
登录
文章检索 我的文章 写文章
C++实现线程池:从原理到代码实现
2023-07-04 15:03:19 深夜i     --     --
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++语言来实现一个简单的线程池。在实际使用中,我们需要根据具体的应用场景和需求来选择合适的线程池实现方案。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复