首页 > 编程语言 >线程池(C++11)

线程池(C++11)

时间:2024-07-19 21:07:50浏览次数:15  
标签:11 std task auto C++ future 线程

已经有现成的实现,本博客摘抄讲解附源码链接。参考的博客质量已经非常高,避免找来找去。

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++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博客

标签:11,std,task,auto,C++,future,线程
From: https://www.cnblogs.com/xixixing/p/18312364

相关文章

  • P1182 数列分段 Section II
    传送锚点:数列分段SectionII-洛谷题目描述对于给定的一个长度为\(N\)的正整数数列\(A_{1\simN}\),现要将其分成\(M\)(\(M\leqN\))段,并要求每段连续,且每段和的最大值最小。关于最大值最小:例如一数列\(4\2\4\5\1\)要分成\(3\)段。将其如下分段:\([4\2][4\5][1......
  • 奇妙的 c++ 混合运算式
    先来看看如下的式子:a*b+c当你在c++中运行它时,你很清楚它是先计算*再计算+的。那么请再来看看这个式子:a+b+c请问它是先执行第一个+,还是先执行第二个+呢?这个问题看上去无解,但实际上我们可以解答:#definelllonglonginta=INT_MAX,b=INT_MAX;llc......
  • CodeForces - 1139D
    题目大意序列每次随机添加一个\([1,m]\)的整数,直到序列\(gcd=1\)停止,求期望操作次数。分析模拟过程发现只关心整个序列的\(gcd\)与下一次会添加什么,那么根据期望\(dp\)套路可得状态\(f_{i}\)表示当前序列\(gcd=i\),期望还操作多少次使得\(gcd=1\)。考虑枚举下一个......
  • C++类和对象 后篇
    C++类和对象后篇构造函数的初始化列表......
  • c++一句话求前缀和,不用循环
    partial_sum是C++标准库中的一个函数,用于计算给定范围内元素的部分和。它接受三个参数:起始迭代器(包含在计算范围内的第一个元素)结束迭代器(不包含在计算范围内的最后一个元素)输出迭代器(存储部分和结果的起始位置)在这个例子中,a.begin()+1表示从数组a的第二个元素开始计......
  • C++ 定义静态数据成员简单测试
    #include<iostream>#include<string>namespace{classA{public:voidaddCount(){++sumCount;}staticintgetSumCount(){returnsumCount;}private:......
  • G69 前缀线性基+贪心法 CF1100F Ivan and Burgers
    视频链接:G69前缀线性基+贪心法CF1100FIvanandBurgers_哔哩哔哩_bilibili   IvanandBurgers-洛谷|计算机科学教育新生态(luogu.com.cn)//前缀线性基+贪心法O(30*n)#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;......
  • Facebook 开源 C++ 框架 Ocean:用于计算机视觉和增强现实
    Facebook开源C++框架Ocean:用于计算机视觉和增强现实来源:OSCHINA编辑: 局2024-07-1211:05:00 0Facebook开源了其内部用于计算机视觉(CV)和增强现实(AR) 应用程序的框架Ocean,用于执行各种任务,包括计算机视觉、几何、媒体处理、网络和渲染。Ocean......
  • 【windows11】笔记本电脑使用PE工具重装系统超详细步骤及常见问题
    因为一些原因昨天重装了一次系统,本来以为是一次简单快捷的重装,但是我们在重装系统的过程中遇到了一些问题,导致重装之后很多出现了一系列小毛病,一度以为自己没装成功,多次重装等烦恼。下面为大家附上部分教程及一些注意事项,相信大家参考别的教程配合可以很顺利地完成。第五步之......
  • Java中的线程池管理与并发性能优化
    Java中的线程池管理与并发性能优化大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在Java中有效管理线程池,以及如何通过优化并发性能提升应用的效率。线程池是管理线程的一个重要工具,能够提高系统的并发处理能力,并减少线程创建和销毁的......