加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

如何用C++實現(xiàn)一個線程池

12/19 11:09
178
閱讀需 5 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

在 C++ 中實現(xiàn)一個簡單的線程池可以通過使用標準庫中的 std::threadstd::queue 來實現(xiàn)。以下是一個基本的線程池示例:

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

class ThreadPool {
public:
    ThreadPool(size_t numThreads) : stop(false) {
        for (size_t i = 0; i < numThreads; ++i) {
            threads.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();
                }
            });
        }
    }

    template<class F>
    void addTask(F&& task) {
        {
            std::unique_lock<std::mutex> lock(queueMutex);
            tasks.emplace(std::forward<F>(task));
        }
        condition.notify_one();
    }

    ~ThreadPool() {
        {
            std::unique_lock<std::mutex> lock(queueMutex);
            stop = true;
        }
        condition.notify_all();
        for (std::thread &worker : threads) worker.join();
    }
    
private:
    std::vector<std::thread> threads;
    std::queue<std::function<void()>> tasks;
    std::mutex queueMutex;
    std::condition_variable condition;
    bool stop;
};

// 示例用法
int main() {
    ThreadPool pool(4);

    for (int i = 0; i < 8; ++i) {
        pool.addTask([i] {
            std::cout << "Task " << i << " is runningn";
            std::this_thread::sleep_for(std::chrono::seconds(1));
        });
    }

    // 注意:主線程不能提前結(jié)束,否則線程池中的任務(wù)可能無法完成
    // 可以在這里等待所有任務(wù)完成后再退出
    std::this_thread::sleep_for(std::chrono::seconds(5));

    return 0;
}

這段代碼創(chuàng)建了一個簡單的線程池類 ThreadPool,通過添加任務(wù)到任務(wù)隊列并由工作線程線性地執(zhí)行任務(wù)。請注意,這只是一個最基本的線程池示例,實際應(yīng)用還需要考慮更多因素,如異常處理、任務(wù)優(yōu)先級、資源管理等。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜