21xrx.com
2025-02-16 22:06:02 Sunday
登录
文章检索 我的文章 写文章
C++11 线程池解读
2023-06-27 12:33:45 深夜i     --     --
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++项目中使用线程池,那么这个实现是一个不错的起点。

  
  

评论区

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