当前位置: 首页 > news >正文

线程条件变量 生产者消费者模型 Linux环境 C语言实现

只能用来解决同步问题,且不能独立使用,必须配合互斥锁一起用


头文件:#include <pthread.h>
类型:pthread_cond_t
PTHREAD_COND_INITIALIZER 初始化
初始化:int pthread_cond_init(pthread_cond_t * cond, NULL);
清理:int pthread_cond_destroy(pthread_cond_t * cond);
P操作: int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t *mutex);//mutex必须是pthread_mutex_lock返回后的
V操作: int pthread_cond_signal(pthread_cond_t * cond);//只是出队任务等待队列中的第一个任务,让该任务正在阻塞的P操作返回
V操作: int pthread_cond_broadcast(pthread_cond_t * cond);//出队任务等待队列中的所有任务,让所有正阻塞的任务的P操作返回功能:见函数名
返回值:成功0,失败错误码
mutex为已经处于锁状态的互斥锁,因此条件变量必须与一个互斥量配合使用


代码模板:

代码模板:
pthread_cond_t cond;
pthread_mutex_t lock;程序开始时:
pthread_mutex_init(&lock,NULL);
pthread_cond_init(&cond,NULL);程序结束前:
pthread_mutex_destroy(&lock);
pthread_cond_destroy(&cond);A线程为先做线程
pthread_mutex_lock(&lock);
....
pthread_mutex_unlock(&lock);
pthread_cond_signal(&cond);B线程为后做线程
pthread_mutex_lock(&lock);
if(条件表达式为真)
{pthread_cond_wait(&cond,&lock);
}
.....
pthread_mutex_unlock(&lock);

生产者消费者模型(生产者生产出来东西后消费者才能执行)

问题:设计程序,一个线程实现入队操作,另一个实现出队操作, 如果队列中没有数据,出队线程不参与资源的竞争.(条件变量)
代码:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>#if  0
条件变量在生产者消费者模型中使用步骤:
1、定义条件变量和互斥锁,并初始化消费者线程:
1、加锁int pthread_mutex_lock(pthread_mutex_t *mutex);2、判断公共资源中是否有数据
while(公共资源中没有数据成立)
{//造成线程的阻塞,在阻塞之前进行解锁//被唤醒后,申请加锁int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);}3、如果公共资源中有数据, 消费数据4、解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);生产者线程:
1、加锁int pthread_mutex_lock(pthread_mutex_t *mutex);2、生产数据, 并放到公共资源中3、解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);4、发送信号给条件变量, 唤醒所有阻塞在条件变量上的线程int pthread_cond_signal(pthread_cond_t *cond);#endifstruct  node{int data;struct node *next;
};pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // 初始化cond条件变量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 初始化mutex锁struct node *head = NULL;//生产者线程
void* product(void* argv){struct node *pnew = NULL;// sleep(10);while(1){pnew = malloc(sizeof(struct node));assert(pnew != NULL);pnew->data = rand();pnew->next = NULL;printf("========product: %d\n", pnew->data);pthread_mutex_lock(&mutex); // 上锁pnew->next = head;head = pnew;pthread_mutex_unlock(&mutex); // 解锁pthread_cond_signal(&cond); // 发出信号sleep(1);}return NULL;
}//消费者线程
void*  consumer(void* argv){struct node *pdel = NULL;while(1){pthread_mutex_lock(&mutex); // 上锁while(NULL == head){ // 判断条件是否满足printf("wait..\n");pthread_cond_wait(&cond, &mutex); // 解锁等待,条件满足后再上锁printf("wait  over...\n");}printf("------->consumer: %d\n", head->data);pdel = head;head = head->next;free(pdel);pthread_mutex_unlock(&mutex); // 解锁sleep(1);}return NULL;
}int main(){pthread_t  pth1, pth2;if(0 != pthread_create(&pth1, NULL, product, NULL)){perror("pthread_create");return -1;}if(0 != pthread_create(&pth2, NULL, consumer, NULL)){perror("pthread_create");return -1;}pthread_join(pth1, NULL); // 回收线程pthread_join(pth2, NULL);pthread_mutex_destroy(&mutex); // 销毁锁pthread_cond_destroy(&cond); // 销毁条件变量return 0;
}

输出:

相关文章:

线程条件变量 生产者消费者模型 Linux环境 C语言实现

只能用来解决同步问题&#xff0c;且不能独立使用&#xff0c;必须配合互斥锁一起用 头文件&#xff1a;#include <pthread.h> 类型&#xff1a;pthread_cond_t PTHREAD_COND_INITIALIZER 初始化 初始化&#xff1a;int pthread_cond_init(pthread_cond_t * cond, NULL);…...

C++ packaged_task

packaged_task 是 C11 标准库中引入的一个模板类&#xff0c;它用于将可调用对象&#xff08;如函数、lambda 表达式、函数对象或绑定表达式&#xff09;包装起来&#xff0c;并允许异步地获取其结果packaged_task 类提供了一种方便的方式来创建任务&#xff0c;这些任务可以被…...

【联表查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...

嵌入式C编程:宏定义与typedef的深入对比与应用

目录 一、宏定义&#xff08;Macro Definition&#xff09; 1.1. 特点与应用 1.1.1 定义常量 1.1.2 定义函数式宏 1.1.3 条件编译 1.2. 作用范围和生命周期方面 1.3. 应用注意事项 二、typedef 2.1. 特点与应用 2.1.1 简化类型声明 2.1.2 提高代码可读性 2.1.3 实现…...

高级java每日一道面试题-2024年12月03日-JVM篇-什么是Stop The World? 什么是OopMap? 什么是安全点?

如果有遗漏,评论区告诉我进行补充 面试官: 什么是Stop The World? 什么是OopMap? 什么是安全点? 我回答: 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;Stop The World、OopMap 和 安全点 是与垃圾回收&#xff08;GC&#xff09;和性能优化密切相关的概念。理…...

【openGauss︱PostgreSQL】openGauss或PostgreSQL查表、索引、序列、权限、函数

【openGauss︱PostgreSQL】openGauss或PostgreSQL查表、索引、序列、权限、函数 一、openGauss查表二、openGauss查索引三、openGauss查序列四、openGauss查权限五、openGauss或PostgreSQL查函数六、PostgreSQL查表七、PostgreSQL查索引八、PostgreSQL查序列九、PostgreSQL查权…...

Dataset用load_dataset读图片和对应的caption的一个坑

代码&#xff1a; data_files {} if args.train_data_dir is not None:data_files["train"] os.path.join(args.train_data_dir, "**")dataset load_dataset("imagefolder",data_filesdata_files,cache_dirargs.cache_dir,) 数据&#xff1…...

【信息系统项目管理师】第7章:项目立项管理 考点梳理

文章目录 7.1 项目建议与立项申请7.2 项目可行性研究7.2.1 可行性研究的内容7.2.2 初步可行性研究7.2.3 详细可行性研究&#xff08;重点&#xff09; 7.3 项目评估与决策 【学习建议】本章大概考选择题2分左右&#xff0c;有可能考案例题。论文早年考过。本章知识点比较集中&a…...

知识库、提示词对大语言模型的影响测试

简介 通过对比有无知识库&#xff0c;测试大语言模型的回答 有无提示词对比测试 前提 大语言模型&#xff1a;Qwen1.5-1.8B-Chat-GPTQ-Int4 GPU&#xff1a;1650super&#xff0c;显存4G 提问&#xff1a;华为mate70 没有提示词 回答的内容如下 “华为mate70pro和mate40p…...

vistat-监控和分析网络状态

vistat 是一个用于监控和分析网络状态的工具&#xff0c;通常用于查看网络接口、流量、连接等实时数据。 原理&#xff1a;用户态调用系统接口获取内核中的网络统计信息。 核心功能&#xff1a;网络接口流量监控、查看连接状态、带宽使用分析。 使用方法&#xff1a; 查看接…...

EasyAnimateV5 视频生成大模型原理详解与模型使用

在数字内容创作中&#xff0c;视频扮演的角色日益重要。然而&#xff0c;创作高质量视频通常耗时且昂贵。EasyAnimate 系列旨在利用人工智能技术简化这一过程。EasyAnimateV5 建立在其前代版本的基础之上&#xff0c;不仅在质量上有所提升&#xff0c;还在多模态数据处理和跨语…...

水稻和拟南芥生命周期中单碱基分辨率的m6A定量分析-文献精读88

Quantitative profiling of m6A at single base resolution across the life cycle of rice and Arabidopsis 水稻和拟南芥生命周期中单碱基分辨率的m6A定量分析 水稻参考基因组&#xff08;日本晴品种&#xff09;-CSDN博客 “Xian”&#xff08;籼&#xff09;和“Geng”&…...

学习threejs,使用canvas更新纹理

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Texture 贴图 二、&#x1…...

【笔记2-3】ESP32 bug:PSRAM chip not found or not supported 没有外部PSRAM问题解决

主要参考b站宸芯IOT老师的视频&#xff0c;记录自己的笔记&#xff0c;老师讲的主要是linux环境&#xff0c;但配置过程实在太多问题&#xff0c;就直接用windows环境了&#xff0c;老师也有讲一些windows的操作&#xff0c;只要代码会写&#xff0c;操作都还好&#xff0c;开发…...

大数据hadoop、spark、flink、kafka发展的过程

将sql 代发翻译成java 程序 将python 程序通过pyspark框架翻译成java 程序&#xff0c;然后运行在spark计算框架上...

设计模式-理论基础

理论基础 一、代码质量指标1.可维护性&#xff08;maintainability&#xff09;2.可读性&#xff08;readability&#xff09;3.可扩展性&#xff08;extensibility&#xff09;4.灵活性&#xff08;flexibility&#xff09;5.简洁性&#xff08;simplicity&#xff09;6.可复用…...

猎板 PCB特殊工艺:铸就电子行业核心竞争力新高度

在当今竞争激烈且技术驱动的电子制造领域&#xff0c;印制电路板&#xff08;PCB&#xff09;作为电子产品的关键基石&#xff0c;其特殊工艺的发展水平直接影响着整个行业的创新步伐与产品品质。猎板 PCB 凭借在厚铜板、孔口铺铜、HDI 板、大尺寸板以及高频高速板等特殊工艺方…...

用于目标检测的集中式特征金字塔

摘要 https://arxiv.org/pdf/2210.02093 视觉特征金字塔在多种应用中已展现出其在有效性和效率方面的优越性。然而,现有方法过度关注层间特征交互,却忽略了经验证明有益的层内特征调节。尽管一些方法试图借助注意力机制或视觉变换器来学习紧凑的层内特征表示,但它们忽略了…...

大舍传媒-关于海外媒体宣发的探讨

关于海外媒体宣发的探讨 一、海外媒体宣发的重要性 在当今全球化的时代&#xff0c;海外媒体宣发对于企业、组织和个人来说具有至关重要的意义。通过有效的海外媒体宣发&#xff0c;可以提升品牌知名度&#xff0c;拓展国际市场&#xff0c;增强影响力&#xff0c;吸引更多的潜…...

Python从入门到入狱

Python是从入门到入狱&#xff1f;这个充满调侃意味的说法在程序员圈子里流传甚广。表面看&#xff0c;它似乎是在嘲笑这门语言从简单易学到深陷麻烦的巨大反差&#xff0c;实际上却隐藏着很多值得深思的问题。要解读这个话题&#xff0c;得从Python的特点、使用场景以及潜在风…...

Translumo:跨场景实时翻译解决方案的技术实践与应用指南

Translumo&#xff1a;跨场景实时翻译解决方案的技术实践与应用指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 语言障…...

用快马AI十分钟搭建你的第一篇论文展示官网原型

最近在准备学术成果展示时&#xff0c;发现很多同行都开始搭建个人论文官网。这种展示方式确实比单纯发PDF专业很多&#xff0c;但自己从头开发又太费时间。尝试用InsCode(快马)平台快速搭建原型&#xff0c;没想到十分钟就搞定了基础框架&#xff0c;分享下具体实现思路。 明确…...

三步快速配置:极简二维码插件让你的浏览器变身智能跨设备助手

三步快速配置&#xff1a;极简二维码插件让你的浏览器变身智能跨设备助手 【免费下载链接】chrome-qrcode chrome-qrcode - 一个 Chrome 浏览器插件&#xff0c;可以生成当前 URL 或选中文本的二维码&#xff0c;或解码网页上的二维码。 项目地址: https://gitcode.com/gh_mi…...

如何快速掌握GBFR Logs:终极《碧蓝幻想:Relink》战斗数据监控指南

如何快速掌握GBFR Logs&#xff1a;终极《碧蓝幻想&#xff1a;Relink》战斗数据监控指南 【免费下载链接】gbfr-logs GBFR Logs lets you track damage statistics with a nice overlay DPS meter for Granblue Fantasy: Relink. 项目地址: https://gitcode.com/gh_mirrors/…...

能源研究院转让选哪家

能源研究院转让选择建议选择适合的能源研究院转让机构需综合考虑资质、经验、服务范围及行业口碑。以下为关键筛选方向&#xff1a;专业资质与行业经验 优先选择具备国家级资质认证&#xff08;如科技转移服务机构备案&#xff09;的机构&#xff0c;尤其在新能源、储能技术等领…...

Phi-4-mini-reasoning多场景落地:K12教育智能批改、竞赛培训、教师备课助手

Phi-4-mini-reasoning多场景落地&#xff1a;K12教育智能批改、竞赛培训、教师备课助手 1. 模型介绍 Phi-4-mini-reasoning是一款3.8B参数的轻量级开源模型&#xff0c;专为数学推理、逻辑推导和多步解题等强逻辑任务设计。这款模型由微软Azure AI Foundry开发&#xff0c;主…...

Phi-4-mini-reasoningGPU算力适配:A10/A100/T4多卡环境下的推理吞吐调优

Phi-4-mini-reasoning GPU算力适配&#xff1a;A10/A100/T4多卡环境下的推理吞吐调优 1. 模型特性与部署概述 Phi-4-mini-reasoning 是一款专注于推理任务的文本生成模型&#xff0c;特别擅长处理数学题、逻辑题等需要多步分析和简洁结论输出的场景。与通用聊天模型不同&…...

北大“炒股挣钱”课为什么被学生称为“最硬核的风险教育”?它真正教的不是怎么赚钱,而是普通人如何在股市里活下来

一位北大非金融专业的学生上完这堂课后&#xff0c;感慨&#xff1a;“这可能是北大最实用的一门金融课&#xff0c;却让我更坚定地远离个股投机。” 课名叫《炒股挣钱》&#xff0c;可通篇下来&#xff0c;老师赵克常反复强调的却是&#xff1a;“我真正想讲的不是如何暴富&am…...

ABAP开发必备:5种处理前导0的实战技巧(附SQL代码示例)

ABAP开发必备&#xff1a;5种处理前导0的实战技巧&#xff08;附SQL代码示例&#xff09; 在SAP ABAP开发中&#xff0c;物料号、供应商号等关键字段经常需要处理前导0的问题。这些看似简单的数字格式差异&#xff0c;却可能引发数据查询失败、报表统计错误等一系列"蝴蝶效…...

intv_ai_mk11惊艳效果展示:Llama中型模型在中文解释说明任务中的表现

intv_ai_mk11惊艳效果展示&#xff1a;Llama中型模型在中文解释说明任务中的表现 1. 模型核心能力概览 intv_ai_mk11作为基于Llama架构的中等规模文本生成模型&#xff0c;在中文解释说明任务中展现出令人印象深刻的能力。这个开箱即用的解决方案特别适合需要清晰、准确表达的…...