21xrx.com
2024-11-05 16:30:59 Tuesday
登录
文章检索 我的文章 写文章
C++ 线程池
2023-06-27 03:35:17 深夜i     --     --
C++ 线程池 多线程 并发编程 异步编程

              return this->stop || !this->tasks.empty();

C++ 线程池是一种常见的多线程编程模式,能够提高程序的效率和并发性。在处理高并发场景时,使用线程池可以避免频繁创建和销毁线程的问题,而且可以控制同时执行的线程数量,从而提高代码的可维护性。

线程池包含三个基本组件,分别是任务队列、线程池管理器和工作线程。任务队列用于存储需要执行的任务,因此它需要支持线程安全操作,一般使用队列或者列表实现。线程池管理器负责创建并管理工作线程,当任务队列中有任务需要执行时,会从线程池中选取一个空闲的工作线程来执行该任务。工作线程则负责执行任务,并在执行完任务后等待新的任务分配。

C++ 线程池可以使用标准 C++11 中提供的 std::thread 和 std::mutex 实现。以下是一个简单的 C++ 线程池代码示例:


#include <thread>

#include <mutex>

#include <condition_variable>

#include <queue>

class ThreadPool {

public:

  ThreadPool(size_t threads) : stop(false) {

    for (size_t i = 0; i < threads; ++i) {

      workers.emplace_back([this] {

        for (;;) {

          std::function<void()> task;

          {

            std::unique_lock<std::mutex> lock(this->queue_mutex);

            this->condition.wait(lock, [this] {

              return this->stop || !this->tasks.empty();

            });

            if (this->stop && this->tasks.empty())

              return;

            

            task = std::move(this->tasks.front());

            this->tasks.pop();

          }

          task();

        }

      });

    }

  }

  template<class F>

  void enqueue(F&& f) {

    {

      std::unique_lock<std::mutex> lock(queue_mutex);

      tasks.emplace(std::forward<F>(f));

    }

    condition.notify_one();

  }

  ~ThreadPool() {

    {

      std::unique_lock<std::mutex> lock(queue_mutex);

      stop = true;

    }

    condition.notify_all();

    for (std::thread& worker : workers) {

      worker.join();

    }

  }

private:

  std::vector<std::thread> workers;

  std::queue<std::function<void()>> tasks;

  std::mutex queue_mutex;

  std::condition_variable condition;

  bool stop;

};

在上面的代码中,ThreadPool 类包含了一个线程池管理器(workers)、一个任务队列(tasks)、一个互斥锁(queue_mutex)和一个条件变量(condition)。

其中,workers 为一个线程容器,包含多个工作线程,每个工作线程都不断从任务队列中取出任务并执行;tasks 为一个任务队列,存储需要执行的任务;queue_mutex 和 condition 用于保护任务队列的访问,确保线程安全性;stop 用于表示线程池是否停止运行。

enqueue() 函数用于向任务队列中添加一个新的任务,即将函数对象 f 推入队列中。当有新任务加入时,会调用条件变量的 notify_one() 函数通知所有正在等待的线程有新任务可用。workers 容器中的线程会因此从任务队列中取出新任务并执行。

线程池的析构函数中,首先会设置 stop 标志以终止线程池的运行。然后,调用条件变量的 notify_all() 函数通知所有线程停止运行。最后,线程池管理器中的各个工作线程结束运行并退出线程。

总的来说,C++ 线程池是一种常见的多线程编程模式,在处理高并发场景时具有很大的优势,能够提高程序的效率和并发性,从而提高代码的可维护性。

  
  

评论区

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