threadPool(1)

#pragma once

#include <vector>
#include <queue>
#include <memory>
#include <mutex>
#include <condition_variable>
#include <thread>
#include <functional>
#include <future>

class ThreadPool
{
public:
    explicit ThreadPool(size_t threads = std::thread::hardware_concurrency())
        : stop(false)
    {
        for (size_t i = 0; i < 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();
            }
                                 });
    }
    template <class F, class... Args>
    auto enqueue(F &&f, Args &&...args)
    {
        using return_type = std::invoke_result_t<F, Args...>;
        auto task = std::make_shared<std::packaged_task<return_type()>>(
            std::bind(std::forward<F>(f), std::forward<Args>(args)...));
        std::future<return_type> res = task->get_future();
        {
            std::unique_lock<std::mutex> lock(queue_mutex);

            if (stop)
                throw std::runtime_error("enqueue on stopped ThreadPool");

            tasks.emplace([task = std::move(task)]{ (*task)(); });
        }
        condition.notify_one();
        return res;
    }
    ~ThreadPool()
    {
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            stop = true;
        }
        condition.notify_all();
        for (std::thread &worker : workers)
            worker.join();
    }


private:
    std::vector<std::thread> workers;
    std::queue<std::function<void()>> tasks;
    std::mutex queue_mutex;
    std::condition_variable condition;
    bool stop;
};
测试代码

#include <iostream>
#include "threadPool.h"

void test_simple_pool()
{
ThreadPool pool;
pool.enqueue([] {std::cout << "hello\n"; });
auto future = pool.enqueue([](std::string str) {return "hello " + str; }, "world");
std::cout << future.get() << '\n';
}

int main(int argc, char *argv[])
{
test_simple_pool();
}

posted @ 2021-12-17 15:36  cnblogs_kk  阅读(48)  评论(0)    收藏  举报