Linux多线程-3

news2024/12/29 7:28:09

在之前的两篇博客当中,我们讲述了线程概念、线程控制和线程安全三部分内容。紧随其后本篇博客内容:我们首先来讲述生产者和消费者模型,来了解一种多线程的设计模式,然后在此基础上讲述上一篇博客剩余的内容:信号量的相关接口并写代码实现。

目录

1.生产者与消费者模型

1.1内容

1.2优点

1.3实现

2.信号量

2.1内容

2.2接口

2.3实现

1.生产者与消费者模型

1.1内容

生产者与消费者模型是一种典型的设计模式(针对典型应用场景的解决方案),针是对存在大量数据产生以及处理的场景的一种设计模式。

在原始的操作当中,将数据的产生和获取放在同一个线程中执行,这样会造成程序的大部分时间都用于数据处理,容易造成数据资源获取不及时而被丢弃。

所以我们可以采用生产者与消费之模型,其本质是:将数据产生和处理分离处理,生产者有生产者线程,消费者有消费者线程。生产者只负责数据的获取,消费者只负责数据的处理,两个线程最终通过一个缓冲区(数据队列)来实现数据交互。

1.2优点

  1. 解耦合(防止不同函数传递参数内容过于相似);
  2. 支持忙闲不均(数据资源产生和处理大小可以不同);
  3. 支持并发;

1.3实现

结合上述内容中生产者与消费者模型的本质,我们主要需要完成的内容便是:实现一个线程安全的阻塞队列和创建生产者和消费者线程。

对上述代码编译并执行便可得到结果如下:

我们可以很直观的看到生产者和消费者模型的作用,即同时兼顾数据的输入和输出。这样我们便可用于大量数据的分解处理,提高数据资源的处理效率。

2.信号量

2.1内容

对于信号量的内容,我们再进程间通信(ipc)-3这篇博客中讨论过,没有阅读过的读者可以点击下面连接进行查看。

Linux进程间通信-3_王大可~的博客-CSDN博客

2.2接口

信号量中的接口函数都是在POSIX标准之下,

信号量变量类型:sem_t,头文件:#include<semaphore.h>。

int sem_init(sem_t *sem, int pshared, int val);

sem_init接口用于信号量初始化,其中sem是我们定义的信号量变量;pshared:0 -- 线程间;!0 -- 进程间(共享内存);val是信号量初始值。

P操作:

int sem_wait(sem_t *sem);

sem_wait是阻塞接口。

int sem_trywait(sem_t *sem);

 sem_trywait是非阻塞接口。

int sem_timedwait(sem_t *sem, struct timespec *spec);

sem_timedwait是存在设置时长的阻塞接口。

V操作:

int sem_pos(sem_t *sem);

 信号量的销毁:

int sem_destroy(sem_t *sem);

2.3实现

在了解完信号量的内容和相关操作接口时,我们来编写代码实现一个线程安全的环形队列。

最后编译并执行可以得到结果如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨平台开发 uni-app

目录&#xff1a; 1 邂逅跨平台开发 2 初体验uni-app 3 uni-app全局文件 4 内置组件和样式 5 扩展组件 uni-ui 6 跨端兼容实现 7 路由和生命周期 8、扩展组件 uni-ui 9、跨端兼容实现 10、页面路由和传参 11、其它常用API 12、自定义组件 13、状态管理Pinia 创建的…

归并排序的非递归实现

其实想法和递归实现的类似&#xff0c;只不过是通过其他变量分组&#xff0c;而不是mid&#xff0c;我们可以将数组先分为两 两一组&#xff0c;再合并成四四一组&#xff0c;以此类推&#xff0c;最后一次合并排序后&#xff0c;得到的数组就为有序数组了&#xff0c;所以 递…

Docker容器数据卷详解

文章目录 一、数据卷使用二、数据卷容器三、数据卷备份与恢复 数据卷特点&#xff1a; 数据卷会一直在&#xff0c;即使容器销毁可以对数据卷内容直接修改 一、数据卷使用 1、为容器添加数据卷 docker run -itd --name nginx -v /data:/usr/share/nginx/html qinzt/nginx:v1…

15、虚拟内存LLDB高级调试

一、虚拟内存 早期的操作系统 早期的操作系统,并没有虚拟内存的概念.系统由进程直接访问内存中的物理地址,这种方式存在严重的安全隐患.内存中的不同进程,可以计算出他们的物理地址,可以跨进程访问,可以随意进行数据的篡改.早期的程序也比较小,在运行时,会将整个程序全部加载到…

SQL——关于bjpowernode.sql的33道经典例题之18-33

目录 18 列出所有“CLERK”&#xff08;办事员&#xff09;的姓名和部门名称、部门人数 19 列出最低薪水大于1500的各种工作和此工作的全部雇员人数 20 列出在部门“SALES”<销售部>工作的员工姓名 21 列出薪资高于公司平均薪资的所有员工&#xff0c;所在部门、上级…

windows python 安装 mathutils库出现问题解决

项目场景&#xff1a; 在windows11上python安装mathutils库时报错。分如下两种情况安装&#xff0c;都报的是同样的错误&#xff1a; &#xff08;1&#xff09;直接在使用pip安装 python -m pip install mathutils # 或者 pip install mathutils &#xff08;2&#xff09;…

2023年第二届服务机器人国际会议(ICoSR 2023) | IEEE-CPS独立出版

会议简介 Brief Introduction 2023年第二届服务机器人国际会议(ICoSR 2023) 会议时间&#xff1a;2023年7月21日-23日 召开地点&#xff1a;中国上海 大会官网&#xff1a;www.iwosr.org ICoSR 2023将围绕“服务机器人”的最新研究领域而展开&#xff0c;为研究人员、工程师、专…

版本升级|Co-Project V3.1智能项目管理平台——新增三大调整板块 提高自动估算精准度

大家好&#xff0c;CoCode开发云旗下Co-Project V3.1智能项目管理平台正式发布&#xff0c;需求分析工具全新升级&#xff0c;新增功能点调整类型、工作量调整因子和费用调整因子三大板块&#xff0c;全面提高自动估算项目精准度。 一、调整功能点数 要提高项目估算精准度&…

stable diffusion webui 使用

参考各文章以及个人操作后的记录文章&#xff0c;也希望能帮助有需要的人~ 首先进去大概是这样的&#xff0c;介绍下下图几个区域&#xff08;主要是文生图&#xff09;。 一、模型区域 Stable Diffusion checkpoint下拉选择框是用来切换ckpt模型&#xff0c;不清楚的可以看…

快速入门 Python 内置模块 argparse

目录 一、argparse 简介二、The add_argument() method 一、argparse 简介 argparse 模块是 Python 内置的用于命令项选项与参数解析的模块&#xff0c;argparse 模块可以让人轻松编写用户友好的命令行接口&#xff0c;能够帮助程序员为模型定义参数。 使用 argparse 模块的四个…

C++string类详解

C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户自己管理&#xff0c;稍不留神可…

【0基础学爬虫】爬虫基础之自动化工具 Selenium 的使用

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

巨型AI模型时代已结束,我们没搞GPT-5,搞的是GPT-4.99999

文章目录 1、ChatGPT 研发热潮2、GPT5 被叫停“AI危险竞赛”3、 叫停是无法被阻止的4 、 不急于训练GPT-5 1、ChatGPT 研发热潮 自ChatGPT重新吹响人工智能革命的号角后&#xff0c;“百模大战”也已然在太平洋两岸同时拉开了帷幕。 近几个月来&#xff0c;OpenAI ChatGPT 的…

记frp内网穿透配置

这两天由于想给客户看一下我们的系统&#xff0c;于是想到用内网穿透&#xff0c;但是怎么办呢&#xff0c;没有用过呀&#xff0c;于是各处找资料&#xff0c;但是搞完以后已经不记得参考了那些文档了&#xff0c;对不起各位大神&#xff0c;就只能写出过程和要被自己蠢死的错…

一文了解,AI圈大火的虚拟数字人到底是什么?

近年来&#xff0c;人工智能技术的发展和应用已经成为科技领域的热门话题。AI不仅可以帮助人们解决各种问题&#xff0c;还可以提高生产效率、改善生活质量等方面做出贡献。而虚拟数字人作为AI技术的一种应用&#xff0c;也在不断地发展和应用&#xff0c;为人们带来更多的便利…

maven安装教程 linux

文章目录 1.maven下载1.1 移动压缩包位置1.2 解压1.3 改名 2. maven 配置修改2.1 创建仓库2.2 编辑settings.xml文件2.3 添加环境变量 1.maven下载 由于maven 暂不支持直接用yum安装遂采用此方法安装 点击链接下载apache-maven-3.6.3-bin.tar.gz wget https://archive.apach…

Javaee Spring的AOP简介

一.Spring的AOP简介 1.1 什么是AOP AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意思为面向切面编程&#xff0c;是通过预编译方式和运行期动态代 理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是…

人工智能论文的风格特点

搞清楚AI领域论文的风格特点是写出一篇高质量AI论文的前提&#xff0c;AI领域的论文有如下显著特点。 1. 论文的架构非常清晰且富有逻辑。一篇高质量的AI论文&#xff0c;读者通过大致扫一眼论文的各级标题就能够对论文的写作思路形成清晰的认识&#xff0c;明白论文各部分之间…

防火墙日志取证及分析

防火墙日志取证 网络安全解决方案的主要目的是保护网络免受攻击。它应监视安全事件并实时提醒&#xff0c;以帮助管理员尽快采取补救措施。此外&#xff0c;您需要深入的信息来分析任何漏洞的根本原因、攻击事件重建和用户活动;这就是取证日志分析的用武之地。 取证日志分析软…

广州蓝景分享—遇到网页慢,我们该怎么办?

前言 移动互联网时代&#xff0c;用户对于网页的打开速度要求越来越高。首屏作为直面用户的第一屏&#xff0c;其重要性不言而喻。优化用户体验更是我们前端开发非常需要 focus 的东西之一。 从用户的角度而言&#xff0c;当打开一个网页&#xff0c;往往关心的是从输入完网页…