位置: 编程技术 - 正文

linux中编写自己的并发队列类(Queue 并发阻塞队列)(编写自己的linux系统)

编辑:rootadmin

设计并发队列

上述代码是有效的。但是,请考虑这样的情况:您有一个很长的队列(可能包含超过 , 个元素),而且在代码执行期间的某个时候,从队列中读取数据的线程远远多于添加数据的线程。因为添加和取出数据操作使用相同的互斥锁,所以读取数据的速度会影响写数据的线程访问锁。那么,使用两个锁怎么样?一个锁用于读取操作,另一个用于写操作。给出修改后的 Queue 类。

设计并发阻塞队列

目前,如果读线程试图从没有数据的队列读取数据,仅仅会抛出异常并继续执行。但是,这种做法不总是我们想要的,读线程很可能希望等待(即阻塞自身),直到有数据可用时为止。这种队列称为阻塞的队列。如何让读线程在发现队列是空的之后等待?一种做法是定期轮询队列。但是,因为这种做法不保证队列中有数据可用,它可能会导致浪费大量 CPU 周期。推荐的方法是使用条件变量,即 pthread_cond_t 类型的变量。

并发阻塞队列设计有两个要注意的方面:

1.可以不使用 pthread_cond_broadcast,而是使用 pthread_cond_signal。但是,pthread_cond_signal 会释放至少一个等待条件变量的线程,这个线程不一定是等待时间最长的读线程。尽管使用 pthread_cond_signal 不会损害阻塞队列的功能,但是这可能会导致某些读线程的等待时间过长。

2.可能会出现虚假的线程唤醒。因此,在唤醒读线程之后,要确认列表非空,然后再继续处理。强烈建议使用基于 while 循环的 pop()。

设计有超时限制的并发阻塞队列

在许多系统中,如果无法在特定的时间段内处理新数据,就根本不处理数据了。例如,新闻频道的自动收报机显示来自金融交易所的实时股票行情,它每 n 秒收到一次新数据。如果在 n 秒内无法处理以前的一些数据,就应该丢弃这些数据并显示最新的信息。根据这个概念,我们来看看如何给并发队列的添加和取出操作增加超时限制。这意味着,如果系统无法在指定的时间限制内执行添加和取出操作,就应该根本不执行操作。

设计有大小限制的并发阻塞队列

最后,讨论有大小限制的并发阻塞队列。这种队列与并发阻塞队列相似,但是对队列的大小有限制。在许多内存有限的嵌入式系统中,确实需要有大小限制的队列。对于阻塞队列,只有读线程需要在队列中没有数据时等待。对于有大小限制的阻塞队列,如果队列满了,写线程也需要等待。

要注意的第一点是,这个阻塞队列有两个条件变量而不是一个。如果队列满了,写线程等待 _wcond 条件变量;读线程在从队列中取出数据之后需要通知所有线程。同样,如果队列是空的,读线程等待 _rcond 变量,写线程在把数据插入队列中之后向所有线程发送广播消息。如果在发送广播通知时没有线程在等待 _wcond 或 _rcond,会发生什么?什么也不会发生;系统会忽略这些消息。还要注意,两个条件变量使用相同的互斥锁。

推荐整理分享linux中编写自己的并发队列类(Queue 并发阻塞队列)(编写自己的linux系统),希望有所帮助,仅作参考,欢迎阅读内容。

linux中编写自己的并发队列类(Queue 并发阻塞队列)(编写自己的linux系统)

文章相关热门搜索词:linux怎么编写程序,linux怎么写,linux怎么编写程序,linux系统中怎么编写一个程序,linux编写自己姓名加日期的.c文件,linux怎么编写,linux系统中怎么编写一个程序,linux怎么编写,内容如对您有帮助,希望把文章链接给更多的朋友!

linux多线程编程详解教程(线程通过信号量实现通信代码) 线程分类线程按照其调度者可以分为用户级线程和核心级线程两种。(1)用户级线程用户级线程主要解决的是上下文切换的问题,它的调度算法和调度

Linux进程通信(IPC)方式简介 进程间通信的目的数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。共享数据:多个进程想要操作共

shell监控linux系统进程创建脚本分享 #!/bin/shwhiletruedopsax-ocommand|sort|uniq1.txtusleeppsax-ocommand|sort|uniq2.txtdiff1.txt2.txt|grep'^+[^+]'|whilereadadoa=`echo${a#*+}`if[["$a"!="uniq"]]&&[["$a"!="sort"]]&&[["$a"!=""]]thene

标签: 编写自己的linux系统

本文链接地址:https://www.jiuchutong.com/biancheng/374719.html 转载请保留说明!

上一篇:Linux oracle数据库自动备份自动压缩脚本代码(linux oracle数据库登录)

下一篇:linux多线程编程详解教程(线程通过信号量实现通信代码)(linux多线程编程详解)

  • 商场购物卡的会员怎么用
  • 零税率和免税一样吗?哪一个更优惠?
  • 工会费缴纳基数
  • 研究开发费用资本化和费用化
  • 打印复印费的明细怎么开?
  • 从商业企业购进商品
  • 预计负债账务处理 固定资产
  • 产权转移书据印花税计入什么科目
  • 出售固定资产取得的收入
  • 会员卡退钱是退全额吗
  • 公司长期应付账款怎么算
  • 社保证明缴费证明查询在哪查
  • 税务系统勾了为什么还能认证?
  • 加油费发票7月1日开具
  • 水利建设基金的缴费基数是什么
  • 增值税返还收入冲减进项税
  • 店铺拆除费用
  • 预提费用多少
  • 支付给外单位的押金是其他应收款吗
  • 工资五险一金缴费标准是多少
  • 员工有多处收入怎么申报个人所得税
  • 收到工程结算单,怎么回复不认可
  • 电脑开始菜单在右边怎么调回来
  • 防暑降温费会计处理
  • 准予从销项税额中扣除的有
  • 上市公司发行股票会计分录
  • 一次性支付一年租金怎么做账
  • 即征即退,先征后退,先征后返的区别?
  • windows安装无法继续,若要安装请重新启动
  • 小规模纳税人减半征收的六税两费
  • 表单建模
  • 测试工程师有前途么
  • 通过ChatGPT实现的ChatPDF,简单的应用落地,让你的文档变成一个智能助手,通过对话的方式快速学习文档内容
  • ps怎么把图片套入样机快捷键
  • 享受小微企业免征增值税政策
  • 工伤保险赔付计算
  • 劳务分包属于人工成本吗
  • 小规模企业没有员工如何申报个税
  • 短期借款利息是期间费用吗
  • 盘盈盘亏怎么填写
  • 公允价值变动属于
  • 应收账款和应付账款属于什么科目
  • 什么时候开始取卵
  • 建安业一般纳税人税率是多少
  • 因质量问题质保金未能收回怎么处理
  • 支出费用的区别
  • 购电脑怎么入账
  • 物流公司的会计怎么样
  • 其他应收款核算什么
  • 固定资产怎么编号方便
  • 企业预提费用是什么科目
  • 工业企业待摊费用标准
  • sqlserver删除重复
  • Linux设置jdk环境变量配置
  • badcommandorfilename是什么意思
  • linux系统中用户可以分为三种
  • windows7如何启动记事本
  • 电脑xp系统虚拟内存不足怎么解决
  • MAC OS X 10.8通知中心无法访问、停止更新怎么重启
  • win10 u盘写保护
  • win8 设置
  • win10查看驱动
  • linux系统的安装步骤
  • Cocos2d-JS中JavaScript继承
  • Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
  • java grid
  • Begin OpenGL with Python-1st Day,draw a simple sample.
  • 超漂亮的38种刺绣图案
  • document.getElementById()为null
  • android自定义样式
  • unity的shader用法
  • layout_gravity与gravity的区别
  • jQuery xml字符串的解析、读取及查找方法
  • python redis incr
  • 如何用python做图像处理
  • 怎样学好js中的逻辑
  • 国家税务局公告2018年第28号
  • 北京市税务局的待遇怎么样
  • 工业厂房房产税什么时候开始征收
  • 车辆购置税税率多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设