holyya.com
2025-09-04 16:48:13 Thursday
登录
文章检索 我的文章 写文章
C++实现线程池:详细介绍与代码实现
2023-06-21 15:06:48 深夜i     --     --
C++ 线程池 介绍 代码实现

线程池是一种并发执行的程序设计模式,通常用于在多线程环境下提高程序效率。C++语言作为一种高效、快速、通用的编程语言,它的线程池实现也备受程序员们的青睐。

在本文中,我们将介绍如何在C++语言中实现一个简单的线程池。具体来说,我们将讨论线程池的概念,为什么需要线程池以及如何使用C++语言创建一个线程池程序。

1. 线程池的概念

线程池是一种根据需要预分配一定数量的线程,放入一个线程容器供需要时使用,任务来了就直接从线程池中取出一个线程去执行。当任务执行完毕,线程并不立即销毁,而是放回线程池中,以供下次使用。

2. 为什么需要线程池?

在传统的多线程环境下,每次需要创建一个新线程,使用完毕后销毁,这个过程需要很大的时间开销和系统资源。线程池可以避免这种情况,可以通过预留一定数量的线程,随时待命。这种方式大大缩短了线程创建和销毁的时间,提高了程序的效率和性能。

3. 线程池的代码实现

我们采用C++11标准库中的线程库,实现以下线程池程序。

利用C++11中的关键字typedef定义std::vector容器类型ThreadPool,定义线程池中线程的编号和执行的任务编号。


typedef std::vector<std::thread> ThreadPool;

typedef std::function<void()> Task;

定义一个TaskQueue类型的线程安全的队列,用于管理任务队列。这里可以使用std::deque容器来实现。TaskQueue里面至少包含push方法和pop方法。


class TaskQueue {

public:

  TaskQueue() {}

  void push(const Task&);

  bool empty() const;

  bool try_pop(Task&);

  void wait_and_pop(Task&);

private:

  mutable std::mutex m;

  std::queue<Task> data;

  std::condition_variable c;

};

实现TaskQueue中的方法


void TaskQueue::push(const Task& task) {

  std::lock_guard<std::mutex> lock(m);

  data.push(task);

  c.notify_one();

}

bool TaskQueue::empty() const {

  std::lock_guard<std::mutex> lock(m);

  return data.empty();

}

bool TaskQueue::try_pop(Task& task) {

  std::lock_guard<std::mutex> lock(m);

  if (data.empty())

    return false;

  

  task = data.front();

  data.pop();

  return true;

}

void TaskQueue::wait_and_pop(Task& task) {

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

  c.wait(lock, [this]{ return !data.empty(); });

  task = data.front();

  data.pop();

}

在ThreadPool类中,定义线程数量、任务队列、线程容器等信息。ThreadPool中至少包含add方法和stop方法。


class ThreadPool {

public:

  ThreadPool(size_t);

  template<typename F>

  void add(F&& f);

  void stop();

  ~ThreadPool();

private:

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

  TaskQueue tasks;

  std::atomic_bool done;

};

ThreadPool类构造函数初始化线程池并启动工作线程


ThreadPool::ThreadPool(size_t numThreads)

  : done(false)

{

  for (size_t i = 0; i < numThreads; ++i)

  {

    workers.emplace_back(

      [this]

      {

        for (;;)

        {

          Task task;

          tasks.wait_and_pop(task);

          if (done)

            return;

          

          task();

        }

      }

    );

  }

}

实现ThreadPool类中的add和stop方法


template<typename F>

void ThreadPool::add(F&& f)

{

  tasks.push(Task(f));

}

void ThreadPool::stop()

{

  done = true;

  tasks.c.notify_all();

  for (auto& worker : workers) {

    worker.join();

  }

}

4. 总结

通过上面的代码实现示例,我们已经成功地创建了一个C++线程池程序。线程池可以使我们的程序在多线程环境下大幅度提高效率和性能,适用于那些并发运算量较大、涉及到多个线程协作执行的任务。

在实际应用中,可以根据实际情况合理调整线程池的参数,如线程数量、任务队列大小等,以达到最优的运行效果。在多线程编程中,线程池是一种优秀的解决方案,值得我们深入学习和研究。

  
  

评论区

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