linux(线程互斥与同步下)

news2024/12/25 23:41:39

目录:

           1.条件变量概念

           2.生产者消费者模型

           3.将条件变量+生产者消费者+blockqueue(阻塞队列)生产者消费者模型

           4.重新复盘生产者消费者模型应用的理解

------------------------------------------------------------------------------------------------------------------------

1.条件变量概念

当一个线程互斥的访问某个变量(也就是临界资源)时,它可能发现在其它线程改变状态之前,它什么也做不了。

 我们想使用条件变量,其中我们条件变量使用的数据类型是pthread_cond_t ,如果要创建条件变量,和我们的互斥锁一样,只需要在我们的类中或者在代码的全局区域定义上一个 pthread_cond_t类型的变量,原生线程库就自动帮你条件变量

 条件变量有两个核心函数

1.pthread_cond_wait

 2.pthread_cond_signal

 ------------------------------------------------------------------------------------------------------------------------

我们在了解了这些接口之后,先写一个简单的功能,让一个线程控制一个线程启停这样的程序

 

 

 pthread_cond_broadcast

 

--------------------------------------------------------------------------------------------------------------------

2.生产者消费者模型

要是我将FunctionA 这个函数和 FunctionB 这个函数交给了,两个线程

 我们就把这种场景称为生产者消费者模型!!!!

------------------------------------------------------------------------------------------------------------------------

 超市本身不就一份临界资源!!!!

-----------------------------------------------------------------------------------------------------------------------

 3.将条件变量+生产者消费者+blockqueue(阻塞队列)生产者消费者模型

之前我们我们进程讲的进程间通信,不管是管道还是共享内存,进程间通信的本质都是让不同的进程看到同一份资源,但今天,我们可以已同样的视角去看待我们的生产者和消费者模型,我们之前讲进程间通信就是生产者消费者模型,所以管道内部自带同步和互斥机制,而其中管道文件和共享内存就是交易场所

----------------------------------------------------------------------------------------------------------------------------

BlockingQueue(阻塞队列)

在多线程编程种阻塞队列是一种常用于实现生产者和消费者模型的数据结构,其与普通队列区别在于,当队列为空时,从队列当中获取元素的操作将会被阻塞,直到队列中放入元素,当队列为满时,往队列里存放元素的存在也会被阻塞,直到有元素被从队列中取出为止(也就需要条件变量)

 -------------------------------------------------------------------------------------------------------------------

 

 我们的CpTest.cc的代码先写到这里,我们卯足了劲的写我们的类BlockQueue代码

 

 

 

 

 

 ------------------------------------------------------------------------------------------------------------------------------

 你生产者生产的在快,也要等我的消费者,反之也是一样的

那既然消费者消费的那么慢,生产者生产的快,这种场景下,还是得让生产者等消费者,这种场景怎么理解呢??

 是函数就有可能挂起失败,挂起失败,因为if判断是满足条件的,此时队列是慢的,失败程序继续往下走,就有可能继续插入数据,插入一条不该在这时候插入的数据

伪唤醒条件没有满足。但是我线程被唤醒了,此时队列也可能是慢的,单只程序继续往下走,就有可能插入一条不该插入 的数据

这if不合适,应该用while,当我唤醒了之后,在做判断,只要while这个条件还是满足的,我继续挂起,如果条件不满足,我在去生产数据

  ----------------------------------------------------------------------------------------------------------------------------

我们要意识到一个问题,生产和传输数据只是第一步

1.数据怎么来的?? 耗时吗??

2.数据怎么处理??耗时吗??

 

 生产者生产出一批任务  ---->   生产两个数据  x ,y    和 ”+-*/“  放进任务队列里

让消费者从任务队列里拿到这个任务,,拿到自己的上下文之后,然后进行对x 和 y进行”+-*/“的操作!!

 此时我们生产者不断的在生产任务,我们的消费者在不断的处理任务,所以呢此时我们就相当于一个在不断进行生产,一个在不断把任务拿出来,在做处理,所以此时我们就出现了消费者在做任务处理时,生产者在派发任务,就实现了并行运行

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

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

相关文章

智慧垃圾分类大数据可视化监管系统

前言 随着城市化进程的不断加快和居民生活水平的日益提高,城市生活垃圾产生量亦在与日剧增。 建设背景 随着城镇化进程加速、人民生活水平持续提升,城市生活垃圾产生量也在逐年增长。生活垃圾是“放错地方的资源”,能否处理好这些“放错地方的资源”,关系着城乡人…

HackTheBox - 学院【CPTS】复习4 - Web Attacks

Web Attacks 本模块涵盖三种常见的 Web 漏洞,即 HTTP 动词篡改、IDOR 和 XXE,每个漏洞都可能对公司的系统产生重大影响。我们将介绍如何通过各种方法识别、利用和防止它们中的每一个。 HTTP HEAD/GET/POST/PUT/OPTIONS IDOR寻找 一般能够从前端js找到…

HTML5 新增的标签有哪些

HTML5(超文本标记语言第五版)是一种用于创建和呈现网页内容的标准标记语言。是最新的html标准,拥有新的语义、图形以及多媒体元素,简化web应用程序,专为丰富的web内容而设计的,简称“H5”。 语义化标签 H5是…

大数据下批处理性能问题分析优化分享

大数据下批处理性能问题分析优化分享 互联网的步伐加速了硬件资源的发展,而硬件资源的改进,促进社会的建设的快速发展,特别是这互联互通大数据时代,多用户大数据下,单核服务器无法承受处理,特别是对于一个并…

【AI底层逻辑】——篇章3(上):数据、信息与知识香农信息论信息熵

目录 引入 一、数据、信息、知识 二、“用信息丈量世界” 1、香农信息三定律 2、一条信息的价值 3、信息的熵 总结 引入 AI是一种处理信息的模型,我们把信息当作一种内容的载体,计算机发明以前很少有人思考它的本质是什么。随着通信技术的发展&a…

【C++从入门到放弃】模板进阶——非类型模板参数、类模板的特化、模板的分离编译

🧑‍💻作者: 情话0.0 📝专栏:《C从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! 模板进…

行业报告 | 人工智能现状报告(中)

原创 | 文 BFT 机器人 03 行业 与NVIDIA的GPU相比,后起之秀的AL芯片公司还有机会吗? NVIDIA公司的FY2021数据中心收入为106亿美元。在2021年4月,他们确认了32.6亿美元,按年度计算,这比排名前二的人工智能半导体初创公司的估值总和…

Android 14 新功能:区域偏好 Regional Preferences

翻译自 https://alexzh.com/regional-preferences-in-android-14/ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9YLBwPZs-1687502002096)(/Users/ellisonchan/Nutstore Files/ellison-wiki/docs/文章输出/原创/locale/android14-base-locale.png)]…

微信管理系统太多?该如何选择

“您的手机号就是您的微信号吗?我可以加您微信,然后给您发送我们的产品资料和报价。” 毕竟微信是一个月活跃用户超过10亿的应用,成为企业员工,尤其是销售人员沟通联络的首要选择,即使有其他专用办公工具,…

idea中使用java断言——java笔记

在 Java 中,断言是一种用于检查代码中是否满足特定条件的机制。它可以用来确保程序在开发和测试阶段的正确性,并且可以在出现错误时提供有用的错误信息。 断言在 Java 中由关键字 assert 表示,其语法为: assert condition;或者 …

6.Java的JDBC编程

文章目录 🌆1. 数据库编程🌆🏯1.1数据库编程的必备条件🏯🏰1.2下载驱动包🏰⛺️1.3导入驱动包:⛺️🏭1.4编写JDBC代码🏭🗼1.4.1数据库插入操作(在idea中用Jav…

《Opencv3编程入门》学习笔记—第七章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第七章 图像变换 图像变换:即将一幅图像转变成图像数据的另一种表现形式。 一、基于OpenCV的边缘检测 OpenCV中边缘检测的各种算子和滤波器:Can…

【雕爷学编程】Arduino动手做(125)---WT588D语音模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

Linux缓冲区续集——手撕fopen、fwrite、fflush、fclose等C库函数

目录 头文件: 接下来就是设计这四个函数:Mystdio.c 重点讲一讲_fflush函数的底层实现原理: 所以数据内容的经过如下: 总结: 执行——测试写好的这4个函数: 运行结果: 修改测试代码&#xff…

ASEMI快恢复二极管MUR80100PT功能和应用实用指南

编辑-Z MUR80100PT是一种高性能、超快恢复二极管,设计用于各种应用,包括电源、逆变器和电机控制系统。本文将提供一个全面的指南,以了解MUR80100PT的特点和应用,以及它在提高电子设备的效率和可靠性方面的重要性。 MUR80100PT的特…

使用vite创建vue3、react项目

一、使用vite需要的环境 node: 14.18 , 16 vite官网:https://cn.vitejs.dev/guide/ 如上图、官网上明确给出了提醒,要使用vite搭建项目,需要node版本在14.18 二、使用vite创建vue3项目 1. 使用命令启动vite创建项目 使用 NPM: $ npm cr…

开始使用Dotnetty高性能网络库进行网络通讯

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不是…

深度:激光和光纤诞生记

光子盒研究院出品 导读:20世纪50年代以来,科技领域掀起了一场光学革命,激光和光纤的诞生,带来了革命性突破。事实上,激光和光纤的诞生也是第一次量子革命的范畴,因为这些技术的发展是基于对量子规律的观测和…

Java集合之LinkedList详解

Java集合之LinkedList 一、LinkedList类的继承关系1. 基类功能说明1.1. Iterator:提供了一种方便、安全、高效的遍历方式。1.2. Collection:为了使ArrayList具有集合的基本特性和操作。1.3. Queue: LinkedList是一种队列(Queue)数…

I/O error on POST request for “...“ PKIX path building failed的解决办法

异常: 项目中需要用RestTemplate调三方接口,url是https开头加密的。postman可以调通,代码提示没有证书,具体如下: [ERROR][2023-06-25 10:41:16,574][com.peraglobal.restInterface.controller.PLMController]I/O err…