21xrx.com
2024-11-22 07:08:03 Friday
登录
文章检索 我的文章 写文章
C++线程池代码
2023-07-14 09:20:53 深夜i     --     --
C++ 线程池 代码
return stop || !tasks.empty();

C++线程池是一种方便简单的多线程编程方法,它可以在单个程序中创建多个线程来处理相同或不同的任务,平衡系统资源的使用,提高程序的运行效率。在C++线程池中,由线程池管理的线程数量可以动态变化,线程之间的任务分配和执行是由线程池内部的调度器来完成的,开发者只需把需要执行的任务提交给线程池,即可得到执行结果。

下面是一个简单的C++线程池代码,该程序包含了线程池的基本操作,如线程的创建、任务的添加、线程的销毁等。在该程序中,使用了C++11的std::thread库来创建线程,并调用std::unique_lock和std::condition_variable库实现了线程之间的同步和互斥访问。


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

#include <queue>

#include <functional>

class ThreadPool {

public:

  ThreadPool(size_t num_threads) : stop(false) {

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

      workers.emplace_back(

          [this] {

            for (;;) {

              std::function<void()> task;

              {

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

                condition.wait(lock, [this] { return stop || !tasks.empty(); });

                if (stop && tasks.empty())

                  return;

                task = std::move(tasks.front());

                tasks.pop();

              }

              task();

            }

          }

      );

    }

  }

  template<class F>

  void enqueue(F &&f) {

    {

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

      tasks.push(std::function<void()>(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:用于线程同步,在任务队列中添加或移除任务时使用;

- stop:标记线程池是否停止运行。

在ThreadPool类中,最重要的就是构造函数和enqueue()函数。构造函数中,首先根据传递的线程数量创建多个线程,并将它们添加到workers变量中。然后在每个线程中,不断地从任务队列中获取任务,执行它们。enqueue()函数则是用于将任务添加到任务队列中,通过signal_all()函数通知所有线程去执行新的任务。

使用以上的C++线程池代码,开发者可以方便地实现多线程的编程,大大提高程序的运行效率。在实际使用中,为了防止任务队列堆积过多,应该适当调整线程池内的线程数量,以保证系统资源的最优利用。

  
  

评论区

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