惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
L
LINUX DO - 最新话题
T
Troy Hunt's Blog
博客园_首页
量子位
Jina AI
Jina AI
S
SegmentFault 最新的问题
IT之家
IT之家
Hacker News - Newest:
Hacker News - Newest: "LLM"
大猫的无限游戏
大猫的无限游戏
N
News | PayPal Newsroom
P
Proofpoint News Feed
Cyberwarzone
Cyberwarzone
S
Securelist
Google Online Security Blog
Google Online Security Blog
P
Privacy International News Feed
博客园 - Franky
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
NISL@THU
NISL@THU
C
Cisco Blogs
V
Vulnerabilities – Threatpost
腾讯CDC
The Hacker News
The Hacker News
K
Kaspersky official blog
C
Cyber Attacks, Cyber Crime and Cyber Security
雷峰网
雷峰网
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Security Archives - TechRepublic
Security Archives - TechRepublic
A
About on SuperTechFans
Webroot Blog
Webroot Blog
The Register - Security
The Register - Security
Scott Helme
Scott Helme
B
Blog
Security Latest
Security Latest
Last Week in AI
Last Week in AI
Google DeepMind News
Google DeepMind News
W
WeLiveSecurity
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tenable Blog
Blog — PlanetScale
Blog — PlanetScale
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Schneier on Security

博客园 - 悉野

ssh连结vmware中ubuntu的共享文件夹 spring加载冲突问题 spring一个错误修正 抓安卓日记到文件 注册表删除桌面顽固图标 github买的账号无法拉取代码的解决方法 apk常用命令 java服务器异常处理 ES6 学习难度分层 promise原理 材质, 纹理, shader之间的关系 TCP与UDP区别 javascript中=>与function的区别 javascript中函数解析过程 cocos使用fgui 几种服务注册与发现的区别 mybatis测试 向量点乘与叉乘 unity画布3种渲染模式 go学习笔记10(HTTP) go学习笔记9(TCP) go学习笔记8(反射) operator new 是 C++ 动态内存分配的核心函数,负责分配原始内存,不调用构造函数 C++的定位放置new(Placement new) go学习笔记7(泛型,文件读写,测试) go学习笔记6(协程与channel,select使用,线程安全,异常处理) go学习笔记5(函数,结构体,自定义类型和类别名,接口) go学习笔记4(数组与切片,map,if,switch,for循环) go学习笔记3(变量定义,输入输出,基本数据类型) go学习笔记2 laya打包的apk版本更新脚本 laya列表滚动问题 laya踩坑记 laya列表时计算具体体子项是列表中第几个 子弹射击 laya给自己画边框 查看laya已经加载的资源 laya spine事件
c++简单的线程池
悉野 · 2026-04-14 · via 博客园 - 悉野
#include <iostream>
#include <vector>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <thread>

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

    // 构造:启动 threadNum 个工作线程
    explicit ThreadPool(size_t threadNum) : stop(false) {
        for (size_t i = 0; i < threadNum; ++i) {
            workers.emplace_back([this] { worker(); });
        }
    }

    // 析构:停止线程池
    ~ThreadPool() {
        {
            std::lock_guard<std::mutex> lock(mtx);
            stop = true;
        }
        cv.notify_all();  // 唤醒所有线程退出

        for (auto& t : workers) {
            if (t.joinable()) t.join();
        }
    }

    // 提交任务(生产者)
    template <class F>
    void enqueue(F&& f) {
        {
            std::lock_guard<std::mutex> lock(mtx);
            tasks.emplace(std::forward<F>(f));
        }
        cv.notify_one();  // 唤醒一个消费者
    }

private:
    // 工作线程(消费者)
    void worker() {
        while (true) {
            Task task;

            {
                std::unique_lock<std::mutex> lock(mtx);
                // 等待:不停止 且 队列为空 → 等待
                cv.wait(lock, [this] { return stop || !tasks.empty(); });

                // 线程池停止且队列为空 → 退出
                if (stop && tasks.empty()) return;

                // 取任务
                task = std::move(tasks.front());
                tasks.pop();
            }

            // 执行任务(解锁后执行,避免长时间占锁)
            if (task) task();
        }
    }

private:
    std::vector<std::thread> workers;    // 工作线程
    std::queue<Task> tasks;              // 任务队列
    std::mutex mtx;                      // 互斥锁
    std::condition_variable cv;          // 条件变量
    bool stop;                           // 停止标志
};

// 测试
int main() {
    ThreadPool pool(4);  // 4个线程

    // 提交8个任务
    for (int i = 0; i < 8; ++i) {
        pool.enqueue([i] {
            printf("task %d run by thread %lu\n",
                   i, std::this_thread::get_id());
            std::this_thread::sleep_for(std::chrono::milliseconds(200));
        });
    }

    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "all tasks done\n";
    return 0;
}