跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 线程池核心原理与代码实现

C++ 中使用线程池的必要性,包括避免频繁创建销毁线程的开销、控制线程数量及统一管理。阐述了线程池的核心模型(任务队列、工作线程),并提供了一个基于 std::thread、std::mutex 和 std::condition_variable 的最小完整实现示例,包含头文件、源文件及 Makefile 构建配置。

利刃发布于 2026/3/26更新于 2026/9/881 浏览

1. 不使用线程池的问题

void handle_request()  
{  
    std::thread t([]{  
        // 干活  
    });  
    t.detach();  
}

问题很明显:

  • ❌ 频繁 new thread / destroy thread,开销大
  • ❌ 线程数量不可控,可能把系统拖死
  • ❌ 不好统一管理、退出、回收

2. 线程池的核心模型

线程池 ≈ 三样东西

+--------------------+
| Task Queue | <- function<void()>
+--------------------+
▲
|
+--------------------+
| Worker Threads | 多个 while(true)
+--------------------+
▲
|
+--------------------+
| PushBack / Submit |
+--------------------+

3. 最小完整的线程池实现

3.1 定义线程池类

ThreadPool.h

#ifndef THREADPOOL_H  
#define THREADPOOL_H

#include <vector>  
#include <thread>  
#include <queue>  
#include <functional>  
#include <mutex>  
#include <condition_variable>

class ThreadPool  
{  
public:  
     Task = std::function<()>;

    ;  
    ~();

    ;

:  
    std::vector<std::thread> m_workers;  
    std::queue<Task> m_tasks;

    std::mutex m_mutex;  
    std::condition_variable m_cond;  
     m_stop;  
};


using
void
explicit ThreadPool(size_t n)
ThreadPool
void Push(Task task)
private
bool
#endif

ThreadPool.cpp

#include "ThreadPool.h"

ThreadPool::ThreadPool(size_t n)  
    : m_stop(false)  
{  
    for (size_t i = 0; i < n; ++i)  
    {  
        m_workers.emplace_back([this] {  
            while (true)  
            {  
                Task task;  
                {  
                    std::unique_lock<std::mutex> lock(m_mutex);  
                    m_cond.wait(lock, [this] {  
                        return m_stop || !m_tasks.empty();  
                    });

                    if (m_stop && m_tasks.empty())  
                        return;

                    task = std::move(m_tasks.front());  
                    m_tasks.pop();  
                }  
                task();  
            }  
        });  
    }  
}

ThreadPool::~ThreadPool()  
{  
    {  
        std::unique_lock<std::mutex> lock(m_mutex);  
        m_stop = true;  
    }  
    m_cond.notify_all();

    for (auto& t : m_workers)  
        t.join();  
}

void ThreadPool::Push(Task task)  
{  
    {  
        std::unique_lock<std::mutex> lock(m_mutex);  
        m_tasks.push(std::move(task));  
    }  
    m_cond.notify_one();  
}

4. 基础用法示例

int main()  
{  
    ThreadPool pool(3);  // 3 个工作线程

    for (int i = 0; i < 10; ++i)  
    {  
        pool.Push([i] {  
            printf("task %d running in thread %ld\n",  
                   i, std::this_thread::get_id());  
            std::this_thread::sleep_for(std::chrono::seconds(1));  
        });  
    }

    getchar();  
    return 0;  
}

5. Makefile 构建配置

CXX := g++  
CXXFLAGS := -std=c++11 -Wall -O2 -pthread

TARGET := threadpool_demo

SRCS := \  
            main.cpp \  
                  ThreadPool.cpp

OBJS := $(SRCS:.cpp=.o)

all: $(TARGET)

$(TARGET): $(OBJS)  
            $(CXX) $(CXXFLAGS) -o $@ $^

%.o: %.cpp  
            $(CXX) $(CXXFLAGS) -c $< -o $@

clean:  
    rm -f $(OBJS) $(TARGET)

.PHONY: all clean

执行结果如下:

text
./threadpool_demo
task 0 running in thread 140640437704448  
task 1 running in thread 140640446097152  
task 2 running in thread 140640429311744  
task 3 running in thread 140640437704448  
task 4 running in thread 140640446097152  
task 5 running in thread 140640429311744  
task 6 running in thread 140640446097152  
task 8 running in thread 140640429311744  
task 7 running in thread 140640437704448  
task 9 running in thread 140640446097152  

目录

  1. 1. 不使用线程池的问题
  2. 2. 线程池的核心模型
  3. 3. 最小完整的线程池实现
  4. 3.1 定义线程池类
  5. 4. 基础用法示例
  6. 5. Makefile 构建配置

更多推荐文章

查看全部
  • 多无人机协同吊载高速穿越 0.8 米窄缝技术解析
  • 技术副业变现路径:Python 爬虫开发实战指南
  • MVP 至高并发:AI 在前后端开发中的差异化落地实践
  • C++ 开发中 <string> 与 <string.h> 的区别
  • Qt与Web混合编程:CEF与QCefView深度解析
  • ESP32S3 小智 AI 接入音乐 API 实现网络音频流播放
  • OpenClaw 本地部署与飞书机器人接入指南
  • 算法实战:LeetCode 1419 数青蛙(模拟法)
  • AIGC 技术发展与多模态应用实践指南
  • 25 个实用 Prompt 策略,有效降低内容 AI 检测率
  • 算法模拟实战:Z 字形变换与外观数列详解
  • 无人机低空智能巡飞巡检平台架构与核心能力解析
  • Spring Boot 控制层参数绑定 @RequestPart 注解详解
  • 大语言模型发展脉络与主流基座模型概览
  • C++ STL 关联容器实战:set、map 与 multiset 详解
  • TortoiseSVN/TortoiseGit 本地修改文件拉取与更新最佳实践
  • Vue 基础入门:核心设计思想深度拆解
  • Android 集成 WebRTC 与 VAD 的 AI 辅助开发实战:从选型到性能优化
  • 赛博塔罗 Java 与前端实现方案
  • AI 数据标注平台的选型与实践:效率提升背后的技术逻辑

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online