成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

手把手寫一個線程池:基礎不好也能看懂(含詳細注釋)

開發 前端
如果我們一步步拆解,它比你想象的簡單得多。本篇文章會帶你從零開始,構建一個可以跑起來的最小線程池實現,所有代碼配有詳細解釋,哪怕你是初學者也能看懂。

很多人學 C++ 多線程,剛開始聽到“線程池”三個字,第一反應就是:太難了!線程+鎖+隊列,全是讓人頭大的東西,看得腦袋嗡嗡響。

但其實,如果我們一步步拆解,它比你想象的簡單得多。本篇文章會帶你從零開始,構建一個可以跑起來的最小線程池實現,所有代碼配有詳細解釋,哪怕你是初學者也能看懂。

一、線程池到底是什么?

我們先不講代碼,只講“本質”:

線程池的核心思想是:

“提前開好一批線程,任務來了就分配過去執行,用完不銷毀,反復利用。”

這樣可以:

  • ? 避免頻繁創建/銷毀線程帶來的系統開銷
  • ? 實現任務并發處理,提高 CPU 利用率
  • ? 控制線程數量,防止線程過多造成資源搶占

二、線程池需要哪些組件?

為了實現一個最小可用的線程池,我們需要準備:

模塊

用途

std::vector<std::thread>

存儲固定數量的線程

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

存儲待執行的任務

std::mutex

 + std::condition_variable

保證線程間安全、等待通知

stop

 標志

控制線程退出時機

submit()

 接口

提供任務提交的方式

三、線程池的構造函數

我們從構造函數開始,重點:創建線程,并讓它們開始循環工作

ThreadPool(size_t threadCount) : stop(false) {
    for (size_t i = 0; i < threadCount; ++i) {
        workers.emplace_back([this] {
            while (true) {
                std::function<void()> task;
                {
                    std::unique_lock<std::mutex> lock(queueMutex);
                    condition.wait(lock, [this] {
                        return stop || !tasks.empty();
                    });
                    if (stop && tasks.empty()) return; // 安全退出
                    task = std::move(tasks.front());
                    tasks.pop();
                }
                task(); // 執行任務
            }
        });
    }
}

? 詳細解釋:

  • emplace_back([this] {...}) 創建一個線程,執行一個死循環
  • condition.wait(...):如果沒有任務,就讓線程睡著,避免空轉。
  • task = std::move(...):從任務隊列取一個任務出來。
  • task():執行這個任務!

四、任務提交接口 submit

線程池是為任務服務的,我們需要一個函數來“扔任務進去”:

void submit(std::function<void()> f) {
    {
        std::unique_lock<std::mutex> lock(queueMutex);
        if (stop) throw std::runtime_error("ThreadPool stopped");
        tasks.emplace(std::move(f));
    }
    condition.notify_one(); // 喚醒一個線程執行任務
}

核心點:

  • 支持任意無返回值任務(你可以傳入 lambda)
  • 提交后立即喚醒一個“睡著”的線程去執行它

五、析構函數:資源回收

程序結束前,我們要優雅地關閉線程池:

~ThreadPool() {
    {
        std::unique_lock<std::mutex> lock(queueMutex);
        stop = true;
    }
    condition.notify_all(); // 喚醒所有線程退出
    for (std::thread& t : workers) {
        if (t.joinable()) t.join();
    }
}

做了什么?

  • 設置 stop = true,告訴線程池“別再等新任務了”
  • 喚醒所有線程,它們會自己判斷該退出
  • join() 等線程執行完再退出,避免野線程殘留

六、實際測試:線程池能不能用?

int main() {
    ThreadPool pool(3); // 創建一個有3個線程的線程池

    for (int i = 0; i < 6; ++i) {
        pool.submit([i] {
            std::cout << "任務 " << i << " 執行中\n";
            std::this_thread::sleep_for(std::chrono::milliseconds(200));
        });
    }

    std::this_thread::sleep_for(std::chrono::seconds(2));
}

你會看到控制臺輸出類似:

任務 0 執行中
任務 1 執行中
任務 2 執行中
任務 3 執行中
任務 4 執行中
任務 5 執行中

說明線程池真的“并發”跑了多個任務!

七、新手常見誤區提醒

  • 忘記加鎖 → 多線程搶資源,數據錯亂
  • 不喚醒線程 → 提交任務后卡死
  • 主線程提前退出 → 子線程被強制終止

總結一句話

線程池的本質,就是用固定線程輪流干活,用隊列管理任務,用鎖和條件變量保證同步

理解這些基本組件后,你就能輕松掌握多線程的核心套路。

附:完整類定義

class ThreadPool {
public:
    ThreadPool(size_t);
    void submit(std::function<void()>);
    ~ThreadPool();

private:
    std::vector<std::thread> workers;
    std::queue<std::function<void()>> tasks;
    std::mutex queueMutex;
    std::condition_variable condition;
    bool stop;
};


責任編輯:武曉燕 來源: 程序廚
相關推薦

2019-11-18 10:38:03

線程池Java框架

2017-02-22 15:04:52

2020-11-16 16:38:30

人工智能AI

2018-12-24 08:46:52

Kubernetes對象模型

2022-03-09 09:43:01

工具類線程項目

2020-02-15 17:16:05

Kubernetes容器

2019-10-10 11:10:04

SpringBoot異步編程

2020-12-23 09:48:37

數據工具技術

2025-02-17 13:00:00

ChatGPT大模型AI

2025-02-17 10:09:54

2013-09-22 10:34:08

碼農機器學習算法

2024-11-01 05:10:00

2019-03-26 11:15:34

AI機器學習人工智能

2021-06-22 10:43:03

Webpack loader plugin

2022-11-07 18:36:03

組件RPC框架

2010-08-17 14:29:15

2018-05-16 10:07:02

監控報警系統

2019-08-26 09:25:23

RedisJavaLinux

2022-06-28 15:29:56

Python編程語言計時器

2017-11-02 12:08:56

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧洲视频一区二区 | 欧洲精品码一区二区三区免费看 | 亚洲精品久久久久久久久久久 | 欧美日韩亚洲国产综合 | 欧美性生活网 | 国产一级片久久久 | 亚洲国产看片 | 精品一区视频 | 91成人精品 | 亚洲一区二区电影在线观看 | 中文字幕在线免费 | 91欧美| 国产精品久久久久久久一区二区 | 欧美精品在线免费观看 | 精品网| 看a网站 | 91中文字幕在线 | 日本免费在线 | 久草资源在线 | 亚洲综合免费 | 亚洲精品中文字幕在线观看 | 久久精品国产精品青草 | 久久av网站| 久久久久一区 | 天堂色 | 天天视频成人 | 国产精品美女久久久久久免费 | 色综合av | 国产精品免费大片 | 亚洲色欧美另类 | 国产一区电影 | 成人欧美一区二区三区黑人孕妇 | 欧美日韩在线观看视频 | 亚洲福利视频网 | 在线观看 亚洲 | 国户精品久久久久久久久久久不卡 | 国产高清视频在线 | 中文字幕国产视频 | 国产资源网 | 日韩a在线观看 | 欧美日韩视频在线 |