以下是一个简单的C++线程池实现:

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

class ThreadPool {
public:
    explicit ThreadPool(int num_threads) : stop(false) {
        for (int i = 0; i < num_threads; ++i) {
            workers.emplace_back([this] {
                for (;;) {
                    std::function<void()> task;

                    {
                        std::unique_lock<std::mutex> lock(this->queue_mutex);
                        this->condition.wait(lock, [this] { return this->stop || !this->tasks.empty(); });
                        if (this->stop && this->tasks.empty()) return;
                        task = std::move(this->tasks.front());
                        this->tasks.pop();
                    }

                    task();
                }
            });
        }
    }

    ~ThreadPool() {
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            stop = true;
        }
        condition.notify_all();
        for (std::thread &worker : workers) {
            worker.join();
        }
    }

    template<class F>
    void enqueue(F &&f) {
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            tasks.emplace(std::forward<F>(f));
        }
        condition.notify_one();
    }

private:
    std::vector<std::thread> workers;
    std::queue<std::function<void()>> tasks;

    std::mutex queue_mutex;
    std::condition_variable condition;
    bool stop;
};

int main() {
    ThreadPool pool(4);

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

    return 0;
}

该线程池使用一个std::vector存储工作线程,每个线程都在一个无限循环中等待任务。任务存储在一个std::queue中,由std::mutex和std::condition_variable保护。

该线程池提供了一个enqueue模板函数,用于将任务添加到队列中。在enqueue中,任务被移动到std::queue中,并通过std::condition_variable通知等待的工作线程。当线程池被销毁时,所有线程都被要求退出,并等待它们完成任务。

c++ 线程池编写

原文地址: https://www.cveoy.top/t/topic/bgbb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录