" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 學習筆記實戰(zhàn)寫一個簡單的線程池示例

 更新時間:2023年10月29日 15:57:16   作者:Totn  
這篇文章主要為大家介紹了C++實現(xiàn)一個簡單的線程池學習實戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

線程池的工作原理

  • 在構造函數(shù)中,創(chuàng)建指定數(shù)量的工作線程,并將它們存儲在 workers 向量中。
  • 每個工作線程都通過無限循環(huán)來執(zhí)行任務隊列中的任務。
  • 設置一個public函數(shù),接收新任務,封裝為 std::function<void()> 并添加到任務隊列中。
  • 等待的工作線程會被喚醒并獲取任務執(zhí)行,直到線程池被銷毀或調(diào)用 stop() 函數(shù)停止。

第一步, 創(chuàng)建指定數(shù)量的工作線程

class ThreadPool {
public:
    ThreadPool(int num){
        // 啟動指定數(shù)量的線程
        for(int i = 0; i < num; i++ ) {
            // 使用循環(huán)創(chuàng)建指定數(shù)量的工作線程。每個工作線程都是通過`emplace_back`函數(shù)向`workers`容器中添加一個lambda函數(shù)創(chuàng)建的
            // 添加一個lambda函數(shù)即為創(chuàng)建一個線程
            workers.emplace_back([this]{
                // code...
            });
      }
    }
private:
    // 用向量儲存線程
    std::vector<std::thread> workers;
}

第二步在每個線程中啟動死循環(huán),依次從任務隊列中取中任務,直到隊列為空或設置stop標識為true;

第二步,在第一步基礎上,添加代碼

class ThreadPool {
public:
    ThreadPool(int num): stoped(false) {
        // 啟動指定數(shù)量的線程
        for(int i = 0; i < num; i++ ) {
            // 使用循環(huán)創(chuàng)建指定數(shù)量的工作線程。每個工作線程都是通過`emplace_back`函數(shù)向`workers`容器中添加一個lambda函數(shù)創(chuàng)建的
            // 添加一個lambda函數(shù)即為創(chuàng)建一個線程
            workers.emplace_back([this]{
                // 死循環(huán)
                while(true) {
                    // 設置一個task接收從隊列中取出的任務
                    std::function<void()> task;
                    {
                        // 從隊列中取任務要加鎖,以避免重復讀
                        std::unique_lock<std::mutex> lock(ququeMutex);
                        // 如果stoped==true,或任務不為空,則使當前線程等待
                        condition.wait(lock, [this]{ return stroped || !tasks.empty(); });
                        // 設置stoped為true后,則等到任務都完成為退出(tasks任務隊列為空)
                        if (stoped && tasks.empty()) {
                            return;
                        }
                        // 從隊列中接收任務
                        task = std::move(tasks.front());
                        // 彈出已經(jīng)接收的任務
                        tasks.pop();
                    }
                    // 以上代碼使用{}限制了作用域,在域內(nèi)啟用的鎖queueMutex在域結(jié)束后自動解鎖
                }
            });
      }
    }
    // 設置停止標識
    void stop() {
        std::unique_lock<std::mutex> lock(queueMutex);
        stoped = true;
    }
private:
    // 用向量儲存線程
    std::vector<std::thread> workers;
    // 工作隊列
    std::queue<std::function<void()> tasks;
    // 隊列互斥鎖
    std::mutex queueMutex;
    // 條件變量
    std::condition_variable condition;
    // stop標識
    bool stoped;
}

第三步,設置一個函數(shù)用從外部接收任務

// class ThreadBool...
template<class F>
void enqueue(F&& f){
    {
        // 在域內(nèi)啟用鎖, 保證加任務時沒沖突
        std::unique_lock<std::mutex> lock(queueMutex);
        // 轉(zhuǎn)發(fā)任務到tasks隊列中
        tasks.emplace(std::forword<F>(f));
    }
    // 通知一個線程起來接活
    condition.notify_one();
}
// ...

第四步,設置析構函數(shù)等待所有線程執(zhí)行完成

// class ThreadBool
~ThreadPool(){
?。?
         std::unique_lock<std::mutex> lock(queueMutex);
      stoded = true;
     }
     // 阻塞等待所有線程
  for(std::thread& worker: workers){
      worker.join();
  }
}

最后完整代碼

#include <vector>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iostream>
thread_local int thr_num;
class Task{
    public run(int num = 0) {
        thr_num = num;
        std::cout << "當前任務號是" << thr_num << std::endl;
    }
}
class ThreadPool {
public:
    ThreadPool(int num): stoped(false) {
        // 啟動指定數(shù)量的線程
        for(int i = 0; i < num; i++ ) {
            // 使用循環(huán)創(chuàng)建指定數(shù)量的工作線程。每個工作線程都是通過`emplace_back`函數(shù)向`workers`容器中添加一個lambda函數(shù)創(chuàng)建的
            // 添加一個lambda函數(shù)即為創(chuàng)建一個線程
            workers.emplace_back([this]{
                // 死循環(huán)
                while(true) {
                    // 設置一個task接收從隊列中取出的任務
                    std::function<void()> task;
                    {
                        // 從隊列中取任務要加鎖,以避免重復讀
                        std::unique_lock<std::mutex> lock(ququeMutex);
                        // 如果stoped==true,或任務不為空,則使當前線程等待
                        condition.wait(lock, [this]{ return stroped || !tasks.empty(); });
                        // 設置stoped為true后,則等到任務都完成為退出(tasks任務隊列為空)
                        if (stoped && tasks.empty()) {
                            return;
                        }
                        // 從隊列中接收任務
                        task = std::move(tasks.front());
                        // 彈出已經(jīng)接收的任務
                        tasks.pop();
                    }
                    // 以上代碼使用{}限制了作用域,在域內(nèi)啟用的鎖queueMutex在域結(jié)束后自動解鎖
                }
            });
      }
    }
    // 設置停止標識
    void stop() {
        std::unique_lock(std::mutex )
        stoped = true;
    }
private:
    // 用向量儲存線程
    std::vector<std::thread> workers;
    // 工作隊列
    std::queue<std::function<void()> tasks;
    // 隊列互斥鎖
    std::mutex queueMutex;
    // 條件變量
    std::condition_variable condition;
    // stop標識
    bool stoped;
}
int main() {
    ThreadPool tp(4);
    Task task;
    for(int i = 0; i<4; i++) {
        int num = i;
        tp.enqueue([num, &task] {
            task.run(num);
        });
    }
    return 0;
}

以上就是C++ 學習筆記實戰(zhàn)寫一個簡單的線程池示例的詳細內(nèi)容,更多關于C++ 線程池的資料請關注腳本之家其它相關文章!

相關文章

  • C++實現(xiàn)LeetCode(42.收集雨水)

    C++實現(xiàn)LeetCode(42.收集雨水)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(42.收集雨水),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++ 虛函數(shù)實戰(zhàn)示例詳解

    C++ 虛函數(shù)實戰(zhàn)示例詳解

    C++抽象基類cap_ops定義設備操作接口,支持多態(tài),統(tǒng)一管理攝像頭、傳感器等設備,包含線程控制與資源管理方法,建議使用智能指針和日志,便于擴展和維護,本文給大家介紹C++ 虛函數(shù)實戰(zhàn),感興趣的朋友一起看看吧
    2025-07-07
  • 淺談C++空間配置器allocator

    淺談C++空間配置器allocator

    在STL中,Memory Allocator處于最底層的位置,為一切的Container提供存儲服務,是一切其他組件的基石。對于一般使用 STL 的用戶而言,Allocator是不可見的。本文將主要介紹C++空間配置器allocator
    2021-06-06
  • QT5實現(xiàn)UDP通信的示例代碼

    QT5實現(xiàn)UDP通信的示例代碼

    本文主要介紹了QT5實現(xiàn)UDP通信的示例代碼,主要使用QUdpSocket類用于實現(xiàn)UDP通信,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C++ vector的介紹及常見功能實現(xiàn)

    C++ vector的介紹及常見功能實現(xiàn)

    這篇文章主要介紹了C++ vector的介紹及模擬實現(xiàn),vector在實際中非常的重要,但在實際中我們只要熟悉常見的接口就可以了,最重要的是理解他的底層原理,要能夠自己模擬實現(xiàn)出一個簡單的vector,本文結(jié)合示例代碼給大家詳細介紹,需要的朋友可以參考下
    2023-05-05
  • C++作用域和標識符查找規(guī)則詳解

    C++作用域和標識符查找規(guī)則詳解

    在 C++ 中,作用域(Scope)和標識符查找(Identifier Lookup)是理解代碼行為的重要概念,本文將詳細介紹這些規(guī)則,并通過實例來說明它們的工作原理,需要的朋友可以參考下
    2025-06-06
  • C++深入探究友元使用

    C++深入探究友元使用

    采用類的機制后實現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問類的數(shù)據(jù)成員,這時可以將這些函數(shù)定義為該類的友元函數(shù)
    2022-07-07
  • C語言泛型編程實例教程

    C語言泛型編程實例教程

    這篇文章主要介紹了C語言泛型編程,針對泛型的用法做了深入淺出的實例介紹,是C程序設計中非常實用的技巧,需要的朋友可以參考下
    2014-09-09
  • c++中比較好用的“黑科技”

    c++中比較好用的“黑科技”

    這篇文章主要介紹了c++中比較好用的“黑科技”,一些常用小編沒有給大家羅列出,主要給大家介紹了sort函數(shù),需要的朋友可以參考下
    2020-02-02
  • C語言數(shù)據(jù)結(jié)構實現(xiàn)字符串分割的實例

    C語言數(shù)據(jù)結(jié)構實現(xiàn)字符串分割的實例

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構實現(xiàn)字符串分割的實例的相關資料,希望通過本文能幫助到大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10

最新評論

哈密市| 乡城县| 南雄市| 健康| 蕲春县| 喜德县| 巴东县| 天峻县| 吉林市| 泰州市| 中方县| 三亚市| 红原县| 定结县| 阜新| 汉沽区| 新平| 临洮县| 沧源| 广河县| 临漳县| 丁青县| 澎湖县| 延川县| 德阳市| 临泽县| 辽中县| 遵义市| 临安市| 岗巴县| 江西省| 通辽市| 陆河县| 达拉特旗| 达日县| 韶山市| 融水| 绿春县| 定襄县| 平利县| 阳东县|