码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 基于阻塞队列、线程池的生产者消费者模型


    一、线程池

    二、模型实现

    1、准备工作

    2、创建线程

    3、PushTask函数

    4、PopTask函数

    5、线程执行函数Routines

    三、模型测试


    一、线程池

    和内存池一样,线程池也是为了提升效率。一个服务器可能短时间会接收到很多请求,等接收到请求再创建线程,此时就需要先创建线程,这样就会降低处理速度。

    为了应对这种情况,我们一般会提前创建好一批线程,降低了短时间内创建和销毁线程的成本。就好比你要去火锅店吃火锅,店家不会等你来了再去屠宰场取肉,肯定会先把肉准备好。

    二、模型实现

    现在我们要建立这样一个模型,主线程作为生产者不断的向任务队列中添加任务,而线程池中的线程在不断从任务队列中拿任务。假设任务队列的容量是没有上限的。

    和阻塞队列一样,要实现这么一个模型的关键依然是 放任务PushTask 和 取任务PopTask,除此之外,在创建线程的时候,有一个需要注意的细节

    1、准备工作

    2、创建线程

    我们一次创建 4个线程,要传递给线程的参数暂定,为了方便,我们这里不主动回收线程,而是选择将线程分离。

     这里需要注意的是,pthread_create函数的第三个参数,传入的函数必须满足

    (1) 返回值是 void*

    (2) 输入的参数只有一个,那就是void*

    但是实际上,Routines是定义在类中的,是一个成员函数,参数会包含一个隐藏的this指针,所以站在编译器的角度就变成了 Routines(ThreadPool<T>* this , void* args),所以我们在函数的最开始加上 static

    成员函数一般都是放在代码区,成员函数加了static以后,此时会被放到全局区,这个时候参数就只有void*,不会包含隐藏的this指针 

    3、PushTask函数

    此时因为任务队列的容量没有上限,所以我们这里无需考虑任务队列为满的情况。_task_queue是临界资源,我们需要使用互斥锁来保护这个临界资源

    互斥锁的初始化和销毁这里就不展示了。

    还有一步我们需要等实现 PopTask函数以后再写

    4、PopTask函数

    取任务的时候,既要考虑到维护临界资源,又要考虑到任务队列为空的情况。

    (1) 既然是维护临界资源,那就需要加锁和解锁

    (2) 既然是考虑到任务队列是否为空,当任务队列为空的时候,说明消费者线程不能再继续取任务了,此时要把消费者线程加入到 条件变量中等待,当生产者线程加入任务时,再唤醒消费者线程。

    条件变量的初始化和销毁,这里就不展示了。

     PopTask函数具体实现如下:

    PushTask函数的补充:

    5、线程执行函数Routines

    现在Routines被放到了全局区,但是线程池中的线程需要访问 任务队列,因此我们需要给线程执行函数传递 this指针,这样的话,每个线程就可以访问到类成员变量了

     然后我们在线程执行函数中获得this指针,用一个名为that的指针来接收这个this指针

     我们可以写一个空的Task类,就像下面这样

     线程执行函数的完整代码如下:

     

    三、模型测试

    测试的主函数如下,主线程作为生产者线程每隔1s向任务队列添加任务。

  • 相关阅读:
    在Windows11家庭中文版中启用Copilot(预览版)
    自压缩llm 为 超长记忆
    【虹科传感器小课堂】眨眼之见:通过气体检测进行热流量测量和校正
    Python学习之CSDN21天学习挑战赛计划之16
    设计模式—简单工厂
    【目标跟踪】|模板更新 时间上下文信息(UpdateNet)《Learning the Model Update for Siamese Trackers》
    SSM - Springboot - MyBatis-Plus 全栈体系(二十一)
    [机缘参悟-119] :一个IT人的反思:反者道之动;弱者,道之用 VS 恒者恒强,弱者恒弱的马太效应
    【蓝桥杯选拔赛真题21】C++行李运费 第十二届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析
    pyrouge安装(Linux)新手
  • 原文地址:https://blog.csdn.net/challenglistic/article/details/124900344
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号