21xrx.com
2025-06-22 09:19:50 Sunday
文章检索 我的文章 写文章
C++11 线程池解读
2023-06-27 12:33:45 深夜i     15     0
C++11 线程池 解读

C++11是当前C++标准中最新的一个版本,它引入了许多新的语言特性和标准库功能。其中一个非常有用的特性就是线程池。这个新的功能使C++程序员能够更轻松地管理并发任务,并将其分配给一组线程来执行。在这篇文章中,我们将详细解读C++11中的线程池,让您了解它是如何工作的以及如何实现。

线程池的作用是将并发任务分配给一个可用的线程池,以便执行它们。线程池的设计基于一种简单的想法:为什么不创建一组可以复用的线程,以便在需要执行任务时可以通过它们进行分发?这样可以节省时间和CPU资源,并且减少线程创建和销毁所需要的开销。下面是一个简单的线程池实现:

class ThreadPool {
public:
  ThreadPool(size_t threadCount) : m_Threads() {
    // Create the specified number of threads
    for (size_t i = 0; i < threadCount; i++) {
      m_Threads.emplace_back([=] {
        while (true) {
          std::function<void()> task;
          {
            std::unique_lock<std::mutex> lock(m_QueueMutex);
            m_Condition.wait(lock, [=] { return !m_Tasks.empty(); });
            task = std::move(m_Tasks.front());
            m_Tasks.pop();
          }
          task();
          if (m_ShouldStop && m_Tasks.empty())
            break;
          
        }
      });
    }
  }
  ThreadPool(const ThreadPool&) = delete;
  ThreadPool& operator=(const ThreadPool&) = delete;
  ThreadPool(ThreadPool&&) = delete;
  ThreadPool& operator=(ThreadPool&&) = delete;
  template<class F>
  void enqueue(F&& task) {
    {
      std::unique_lock<std::mutex> lock(m_QueueMutex);
      m_Tasks.emplace(std::forward<F>(task));
    }
    m_Condition.notify_one();
  }
  void stop() {
    {
      std::unique_lock<std::mutex> lock(m_QueueMutex);
      m_ShouldStop = true;
    }
    m_Condition.notify_all();
    for (auto& thread : m_Threads) {
      thread.join();
    }
  }
private:
  std::vector<std::thread> m_Threads;
  std::queue<std::function<void()>> m_Tasks;
  std::mutex m_QueueMutex;
  std::condition_variable m_Condition;
  bool m_ShouldStop = false;
};

这个线程池的实现非常简单,但其工作原理却非常高效。它包含一个队列用于存储要执行的任务。当新任务加入队列时,线程池会唤醒其中一个线程并执行它。如果没有可用的线程,则任务将等待直到线程可用。在执行任务时,线程只需要简单地从队列中获取任务并执行它。当线程池不再需要时,它可以通过调用stop()方法来停止所有线程。

这个简单的线程池实现非常有用,它可以使您的C++程序运行更快,并提高您的代码的可维护性。如果您想在自己的C++项目中使用线程池,那么这个实现是一个不错的起点。

  
  

评论区