一个只有100行代码的线程池开源项目

2024-07-04 16:07:21 浏览数 (2)

项目使用C 11编写,只有一个头文件,但是在github上却获得了7600个stars和2200个fork。非常值得大家下载下来学习,尤其是想要学习多线程编码的同学。

代码相当简明,所有的代码都在 一个类中实现,对外暴露的也仅仅是一个构造函数、一个析构函数以及一个模板函数。具体如下:

代码语言:javascript复制
class ThreadPool {
public:
    ThreadPool(size_t);
    template<class F, class... Args>
    auto enqueue(F&& f, Args&&... args) 
        -> std::future<typename std::result_of<F(Args...)>::type>;
    ~ThreadPool();
private:
    // need to keep track of threads so we can join them
    std::vector< std::thread > workers;
    // the task queue
    std::queue< std::function<void()> > tasks;
    
    // synchronization
    std::mutex queue_mutex;
    std::condition_variable condition;
    bool stop;
};

使用起来也相对简单.即使是刚入门也可以轻松使用,使用案例参考如下代码:

代码语言:javascript复制
int main()
{
    
    ThreadPool pool(4);
    std::vector< std::future<int> > results;
    
    for(int i = 0; i < 8;   i) {
        results.emplace_back(
            pool.enqueue([i] {
                std::cout << "hello " << i << std::endl;
                std::this_thread::sleep_for(std::chrono::seconds(1));
                std::cout << "world " << i << std::endl;
                return i*i;
            })
        );
    }

    for(auto && result: results)
        std::cout << result.get() << ' ';
    std::cout << std::endl;
    
    return 0;
}

0 人点赞