线程池(C++11)

容易理解的,简单一点的线程池系列博客 C++多线程编程(九)——总结篇 - 掘金 (juejin.cn)

 

-----------  以下内容是不容易理解的,使用了很多c++11新特性的线程池 --------------

1、避免频繁创建、销毁线程,实现复用。思路如下:

2、线程函数多种多样,如何封装成统一的函数类型 void( )

第一次封装我们使用bind()函数将多个参数的函数封装为没有形参的package_task对象,因为package_task对象可以通过get_future得到future对象,future对象可以通过get方法获取返回值

先看这个,容易理解源码 c++ 11 线程池---完全使用c++ 11新特性 - MicroDeLe - 博客园 (cnblogs.com)

源码及讲解 GitHub - xyygudu/ThreadPool: threadpool

以上两个链接,不好的地方是线程是detach的,不是join的。但是用于学习c++11新特性,足够了。

 

基于上述理解,更成熟的线程:

 源码分享,采用线程池,实现高性能跨平台C++多线程并行库,附测试!_如何实现跨平台c多线程-CSDN博客

C++11并发学习之六:线程池的实现_c++ createthreadpool-CSDN博客

 

【尾置返回类型】

c++11的新特性,使用auto关键字和decltype来指定返回类型。注意VS2015对decltype有时会报错,VS2019没问题

格式:auto 函数() -> 函数返回类型

在模板编程中使用,如线程池

    template<class F, class... Args>
    auto enqueue(F&& f, Args&&... args)
        -> std::future<typename std::result_of<F(Args...)>::type> {
        using return_type = typename std::result_of<F(Args...)>::type;

        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(queueMutex);

            // don't allow enqueueing after stopping the pool
            if (stop)
                throw std::runtime_error("enqueue on stopped ThreadPool");

            tasks.emplace([task]() { (*task)(); });
        }
        condition.notify_one();
        return res;
    }

参考 C++ 新特性 | C++ 11 | 尾置返回类型-CSDN博客

 

【线程池的设计理念】

轻松掌握C++线程池:从底层原理到高级应用 - 知乎 (zhihu.com)

【任务队列】

C++任务队列与多线程 - 孤火 - 博客园 (cnblogs.com)

posted @ 2024-07-19 21:05  夕西行  阅读(4)  评论(0编辑  收藏  举报