21xrx.com
2024-11-05 14:43:50 Tuesday
登录
文章检索 我的文章 写文章
C++11线程池管理器
2023-07-13 04:10:58 深夜i     --     --
C++11 线程池 管理器

C++11是C++语言标准的一个重要的更新版本,它引入了许多新功能,其中包括线程池管理器。线程池管理器是一种用于管理线程的工具,它可以在单一的线程池中维护多个线程并分配可用的任务。

C++11的线程池管理器具有以下优点:

1. 可以减少线程创建和销毁的开销,增加了性能。

2. 可以避免线程的过度创建和销毁造成的资源浪费,提高了系统稳定性。

3. 允许用户对线程池中的线程进行优先级调度和终止控制,提高了线程的可控性。

4. 具有良好的可扩展性,可以根据系统负载情况自动调整线程池的大小和线程个数。

C++11的线程池管理器有两种实现方式,分别是std::async和std::thread。其中std::async是一种异步执行函数的方法,它可以自动构建一个线程池来执行函数,而std::thread是一种直接构建线程的方法,它需要手动管理线程池大小和线程个数。

下面是一个使用std::async实现的线程池管理器的例子:


#include <iostream>

#include <vector>

#include <thread>

#include <future>

template<typename T>

class ThreadPool {

public:

  ThreadPool() {

    for (int i = 0; i < (std::thread::hardware_concurrency() - 1); ++i) {

      mThreads.emplace_back([this] {

        while (true) {

          std::function<void()> task;

          {

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

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

              return !this->mTasks.empty();

            });

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

            this->mTasks.pop();

          }

          task();

        }

      });

    }

  }

  ~ThreadPool() {

    {

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

      mIsDestroyed = true;

    }

    mEventVar.notify_all();

    for (auto &t : mThreads) {

      if (t.joinable()) {

        t.join();

      }

    }

  }

  template<class F, class... Args>

  auto enqueue(F &&f, Args &&...args) -> std::future<typename std::result_of<F(Args...)>::type> {

    using return_type = typename std::result_of<F(Args...)>::type;

    auto task = std::make_shared<std::packaged_task<return_type()>>(

      std::bind(std::forward<F>(f), std::forward<Args>(args)...)

    );

    std::future<return_type> result = task->get_future();

    {

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

      if (mIsDestroyed) {

        throw std::runtime_error("enqueue on destroyed ThreadPool");

      }

      mTasks.emplace([task]() {

        (*task)();

      });

    }

    mEventVar.notify_one();

    return result;

  }

private:

  std::vector<std::thread> mThreads;

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

  std::mutex mEventMutex;

  std::condition_variable mEventVar;

  bool mIsDestroyed{ false };

};

在这个例子中,我们首先创建了一个ThreadPool类模板,其中包含了线程池中线程个数的自动计算。每个线程都是通过Lambda表达式定义的一个循环,每次等待任务队列非空并获取一个任务执行。

在enqueue函数中,我们使用了std::packaged_task来对提交的任务进行封装,然后使用std::bind将函数和对应的参数绑定起来。最后,将封装好的任务加入到任务队列中,并通知一个空闲的线程来执行这个任务。

在ThreadPool类析构的时候,我们将标记mIsDestroyed设置为true,然后通知所有的线程结束执行并阻塞等待这些线程结束。

总而言之,C++11线程池管理器是一种非常方便的工具,它可以轻松地管理线程,并提高系统稳定性和性能。如果您正在开发C++应用程序并需要管理多线程,那么使用C++11线程池管理器肯定会是一个不错的选择。

  
  

评论区

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