C++如何实现一个简单的线程池_使用C++11 std::queue和std::condition_variable构建

2次阅读

答案是实现c++11线程池需用std::Thread、std::queue、std::mutex和std::condition_variable;1. 创建线程数组和任务队列,用互斥锁保护共享数据,条件变量通知线程;2. 以std::function存储任务,通过enqueue添加;3. 工作线程循环等待任务,加锁取任务并执行;4. 析构时设停止标志,唤醒并join所有线程。

C++如何实现一个简单的线程池_使用C++11 std::queue和std::condition_variable构建

实现一个简单的线程池可以利用 C++11 提供的 std::threadstd::queuestd::condition_variablestd::mutex。核心思路是创建一组工作线程,它们在初始化后等待任务;任务通过队列提交,由条件变量通知线程执行。

1. 线程池的基本结构

线程池类通常包含以下成员:

  • 线程数组:std::vector<:thread> 存储所有工作线程
  • 任务队列:std::queue 存放待执行的任务(函数对象
  • 互斥锁:std::mutex 保护共享的任务队列
  • 条件变量:std::condition_variable 用于唤醒等待任务的线程
  • 停止标志:bool 标记线程池是否关闭

2. 任务类型与存储

使用 std::function 来包装任意可调用对象(如 Lambda、函数指针等),放入队列中。

示例定义任务队列:

立即学习C++免费学习笔记(深入)”;

std::queue<:function>> tasks;
std::mutex mtx;
std::condition_variable cv;

3. 工作线程逻辑

每个线程运行一个循环,从任务队列中取出任务并执行。如果没有任务,就等待条件变量。

C++如何实现一个简单的线程池_使用C++11 std::queue和std::condition_variable构建

察言观数AskTable

企业级ai数据表格智能体平台

C++如何实现一个简单的线程池_使用C++11 std::queue和std::condition_variable构建 72

查看详情 C++如何实现一个简单的线程池_使用C++11 std::queue和std::condition_variable构建

关键点:

  • 加锁访问队列
  • 使用 cv.wait() 阻塞,直到有新任务或停止信号
  • 检查停止标志,避免虚假唤醒导致无限等待

线程主循环示例:

while (true) {
  std::function task;
  {
    std::unique_lock<:mutex> lock(mtx);
    cv.wait(lock, [this] { return stop || !tasks.empty(); });
    if (stop && tasks.empty()) break;
    task = std::move(tasks.front());
    tasks.pop();
  }
  task();
}

4. 添加任务和析构

提供一个模板方法 enqueue,将任意函数包装为任务加入队列:

template
void enqueue(F&& f) {
  {
    std::lock_guard<:mutex> lock(mtx);
    tasks.emplace(std::forward(f));
  }
  cv.notify_one();
}

析构函数需设置停止标志,唤醒所有线程,并 join 它们:

~ThreadPool() {
  {
    std::lock_guard<:mutex> lock(mtx);
    stop = true;
  }
  cv.notify_all();
  for (auto& t : threads) {
    t.join();
  }
}

基本上就这些。这个线程池适合学习和轻量级任务调度,不复杂但容易忽略锁和条件变量的正确配合。

text=ZqhQzanResources