#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<stdlib.h>
#include<unistd.h>
#define CONSUMERS_COUNT 2
#define PRODUCERS_COUNT 2
//定义条件变量与互斥量
pthread_mutex_t mutex;
pthread_cond_t cond;
pthread_t thread[CONSUMERS_COUNT+PRODUCERS_COUNT];
//临界资源
struct msg{
struct msg* next;
int num;
};
//创建头结点
struct msg* head = NULL;
//消费函数
void* consumer(void *arg){
struct msg *mp;
for(;;){
//加锁
pthread_mutex_lock(&mutex);
while(head==NULL){
printf("%d begin wait a condition...\n",(int *)arg);
//等待
pthread_cond_wait(&cond,&mutex);
}
printf("%d end wait a condition...\n",(int *)arg);
printf("%d begin consume product...\n",(int*)arg);
mp= head;
head = mp->next;
//释放锁
pthread_mutex_unlock(&mutex);
printf("consume %d\n",mp->num);
free(mp);
printf("%d end consume product ...\n",(int*)arg);
sleep(rand()%5);
}
}
//生产函数
void* producer(void* arg){
struct msg *mp;
for(;;){
printf("%d begin produce product...\n",(int *)arg);
mp = (struct msg*)malloc(sizeof(struct msg));
mp->num = rand()%100+1;
printf("produce %d\n",mp->num);
//加锁
pthread_mutex_lock(&mutex);
mp->next = head;
head = mp;
printf("%d end produce product...\n",(void*)arg);
//唤醒
pthread_cond_signal(&cond);
//释放锁
pthread_mutex_unlock(&mutex);
sleep(rand()%5);
}
}
int main(void){
//初始化
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
int i = 0;
srand((unsigned int)time(NULL));
//创建消费者线程
for(;i<CONSUMERS_COUNT;i++){
pthread_create(&thread[i],NULL,consumer ,(void*)i);
}
//创建生产者线程
for(i=0;i<PRODUCERS_COUNT;i++){
pthread_create(&thread[i],NULL,producer,(void*)i);
}
//等待线程
for(i=0;i<CONSUMERS_COUNT+PRODUCERS_COUNT;i++){
pthread_join(thread[i],NULL);
}
//销毁
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
}
相关推荐
Linux c语言多线程实现生产者/消费者问题
以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 使用命令cc consumer.c -o consumer编译
【Linux】多线程——生产者和消费者模型
存在多个消费者,消费者对于商品的一次消费是小量的而且时间是不确定的,供货商一次生产的商品是大量的且时间是确定的(在工人的上班时间才能操作机械生产)。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。其次,我们要明确的是,生产者生产数据的过程可能漫长且独立的,消费者消费(处理)数据的时候可能漫长且独立的。
多线程同步方法解决生产者-消费者问题(linux线程实现)
有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数. 设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符.(2)生产者和消费者各有两个以上.(3)多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码. .c文件是用vi编辑器写的,utf-8和gb2312编码的,如果是windows阅读代码,最好使用utralEdit
Linux多线程——生产者消费者模型
一.生产者消费者模型 1.1 什么是生成者消费者模型 一个进程中的线程有两种角色,一种是生产者,一种是消费者。生产者为消费者提供任务,消费者拿到任务,解决任务。在生成者和消费者之间还有一个"交易场所",是一个内存块。生成者线程将任务放到内存块中,消费者线程在内存块中拿任务。当内存块数据达到一高水位线时,生产者会进行等待,唤醒消费者拿任务,当内存块数据达到一低水位线时,消费者会等待,并且唤醒生产者生产任务。 生成者,消费者存在着3种关系。生产者和生产者之间......
读《认知科学导论》(萨伽德) 总结
1. 作者的写作思路 本书是建立在对心智的理解采用表征与计算的方式。对心智表征-计算的理解方式是与计算机的本质相联系。计算机本质上是一个符号系统,符号系统包含两个部分,一个是符号,另一个是建立在符号上的操作。对心智采用表征-计算的方式理解,很容易与计算机建立起类比关系。同时人们在探索人工智能领域采用表征-计算方式已经取得了无数辉煌的成就,故表征-计算式现在研究的主流方法。 本书的有两个部分组成
Unity3D赛车游戏+脚本基础
本章主要介绍Unity的基础开发流程以及涉及到的概念。这个过程需要我们学会编写一些游戏脚本,在这讲的过程中我们会完成一个赛车小游戏,因此,在讲述这些基本概念和流程的时候,会同时涉及到一点脚本的开发基础.在游戏,电影和动画中,都有一个渲染的帧率,电影是24帧/s,游戏大概是30帧/s(当然也有60帧/s的)。在unity里面1秒钟,Update方法执行了30次。1秒钟有30帧,帧与帧之所消耗的时间是不一样的,那么我如何知道上一帧用了多少时间?Time.deltaTime就是为了解决这个问题。
< Linux > 多线程(生产者消费者模型)
目录 1、生产者消费者模型 生产者消费者模型的例子 生产者消费者模型的特点 生产者消费者模型的优点 2、基于BlockingQueue的生产者消费者模型 概念 模拟实现基于阻塞队列的生产消费模型 基于计算任务的生产者消费者模型(并发)
UG\NX二次开发 获取对象的引用集
获取对象的引用集,一个对象可能有多个引用集,下面这个封装函数可以获取对象的所有引用集。
『Linux』第九讲:Linux多线程详解(四)_ 生产者消费者模型
生产者消费者模型详解
《MySQL 入门教程》第 03 篇 管理数据库
本篇主要介绍 MySQL 数据库的创建、查看、选择和删除操作,包括使用 mysql 命令行和 MySQL Workbench 图形工具两种方式。
【OAG vs RAG】RAG的“语义崩溃“:为什么你的知识库越大,AI越笨?_语义检索oag-优快云博客
19.9 元(AI 编程 / Agent 实战 | 本文同主题系统课程)·49.9 元(AI 时代成长方法论)。单篇不过瘾?订阅解锁全量源码、实战与答疑;文末附资料包领取方式 ↓图1:RAG语义崩溃概念图。
【Linux学习】生产者-消费者模型
生产者 - 消费者模型( Producer-consumer problem) 是一个非常经典的多线程并发协作的模型。在多线程开发中,为了解决生产者和消费者之间速度不匹配的问题,常常会引入一个缓冲区来平衡生产和消费的速度差异。阻塞队列(Blocking Queue)是一种常用于实现生产者和消费者模型的数据结构 缓冲区的作用是暂时存储生产者生产的数据,以便消费者在需要时取出。这样一来,即使生产者的速度比消费者快,生产者也不需要等待消费者立即处理数据,而是可以继续生产新的数据并将其放入缓冲区。同样,如果消费者的
HotSpot G1 GC 的分区记账、SATB 并发标记与停顿目标调优解析
线上GC毛刺该调停顿目标、加大新生代还是换收集器?本文从HotSpot G1的设计出发,梳理分区与巨型对象、卡表与记忆集、写屏障与细化线程、停顿预测、SATB并发标记、自适应IHOP、混合回收规则及Full GC兜底,并注明JDK8至JDK27的版本差异。文中在JDK8与JDK17上实测:停顿目标从200ms降到20ms,伊甸区缩小四成、P99下降但仍超目标;巨型对象会反复触发又撤销并发标记;JDK17并行Full GC平均停顿约为JDK8的三成。最后给出日志解读、参数清单、调优流程与选型。
【Linux线程】Linux多线程实践:深入生产者消费者模型
生产者消费者模型描述了一个或多个生产者线程生成数据,并将其放入缓冲区,同时一个或多个消费者线程从缓冲区中取出数据进行处理的过程。这种模式不仅有效地实现了数据的生成与处理之间的解耦,还通过引入缓冲区来平衡生产者和消费者之间的速度差异,从而提高了系统的整体效率和稳定性
车牌识别系统
随这图形图像技术的发展,现在的车牌识别技术准确率越来越高,识别速度越来越快。无论何种形式的车牌识别系统,它们都是由触发、图像采集、图像识别模块、辅助光源和通信模块组成的。车牌识别系统涉及光学、电器、电子控制、数字图像处理、计算视觉、人工智能等多项技术。触发模块负责在车辆到达合适位置时,给出触发信号,控制抓拍。辅助光源提供辅助照明,保证系统在不同的光照条件下都能拍摄到高质量的图像。图像预处理程序对抓拍的图像进行处理,去除噪声,并进行参数调整。然后通过车牌定位、字符识别,最后将识别结果输出。 牌照自动识别是一
128、点云配准与ICP:经典配准算法与深度学习配准
上周调试一台双臂协作机器人,左手持结构光相机扫描桌面上的随机堆叠工件,右手准备执行抓取。问题出在“对齐”这一步——相机扫描得到的点云和CAD模型点云之间差了大约15度的旋转,导致抓取姿态计算出来直接怼到桌面上。我第一反应是“ICP跑一下不就行了”,结果跑了三分钟,误差纹丝不动,甚至越迭代越发散。后来查了日志才发现,初始位姿给得太离谱,ICP直接掉进了局部最优。这个场景太典型了——很多人以为点云配准就是调个ICP库函数,实际工程里坑比想象中多得多。今天这篇笔记,咱们把点云配准这件事从头捋一遍。
【Linux多线程】生产者消费者模型
本篇博客将会介绍Linux多线程中一个非常重要的模型——生产者消费者模型
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
Linux多线程【生产者消费者模型】
生产者消费者模型(CP模型)是一种非常经典的设计,常常出现在各种 「操作系统」 书籍中,深受教师们的喜爱;这种模型在实际开发中还被广泛使用,因为它在多线程场景中是十分高效的!「生产者消费者模型」是通过一个容器来解决生产者与消费者的强耦合关系,生产者与消费者之间不直接进行通讯,而是利用 「容器」来进行通讯
lwip-2.0.3
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
Linux:多线程---同步&&生产者消费者模型
文章摘要: 本章深入探讨线程同步机制,重点介绍了条件变量的实现原理和使用方法。通过VIP自习室的类比,阐述了条件变量如何配合互斥锁解决线程调度问题。文章分析了代码中常见的线程安全问题,如共享资源访问冲突和数据竞争。随后引入生产者消费者模型,解释其通过"超市"缓存区实现生产消费解耦的原理,并指出模型中的三类线程关系:生产者间互斥、消费者间互斥、生产消费间互斥与同步。最后通过代码示例展示了条件变量的实际应用,包括线程等待、唤醒机制以及临界资源状态判断的注意事项。
Linux多线程[生产者消费者模型]
本文介绍了信号量机制及其在多线程同步中的应用,重点探讨了生产者消费者模型的实现。首先阐述了信号量的概念,将其比喻为公共自行车亭的资源管理系统,通过P/V操作控制资源访问。随后分析了互斥锁、条件变量和信号量的区别与适用场景。接着详细讲解了生产者消费者模型的特点和优点,包括高效性、灵活性和低耦合性。最后展示了基于环形队列的实现方案,提供了Task任务类和主程序代码示例,演示了多生产者多消费者场景下的线程同步机制。
【linux】多线程(六)生产者消费者模型,queue模拟阻塞队列的生产消费模型
一、生产者消费者模型 原理介绍 如何理解高效呢? 为什么要使用生产者消费者模型 二、queue模拟阻塞队列的生产消费模型 Tash.hpp 基本框架 operator()() GetTask GetResult BlockQueue.hpp 基本框架 push pop 三、模拟单生产者单消费者模型 main.c 四、多生产者多消费者模型 main.c
Linux多线程(十二)之【生产者消费者模型】
生产者消费者模型通过阻塞队列解耦生产者和消费者,平衡双方处理能力。生产者将数据放入队列后无需等待消费者处理,消费者直接从队列获取数据。该模型具有解耦、支持并发和忙闲不均的优点。阻塞队列在空时阻塞消费者操作,在满时阻塞生产者操作。代码实现展示了单线程和多线程的生产消费模型,使用互斥锁和条件变量确保线程安全。判断条件应在加锁后进行,并使用while循环防止伪唤醒。
【Linux】多线程 -> POSIX信号量与基于RingQueue的生产者消费者模型
POSIX信号量、信号量的相关操作、基于RingQueue环形队列的生产者消费者模型......
Linux多线程系列三: 生产者消费者模型,信号量使用,基于阻塞队列和环形队列的这两种生产者消费者代码的实现
Linux多线程系列三: 生产者消费者模型,信号量使用,基于阻塞队列和环形队列的这两种生产者消费者代码的实现
803



被折叠的 条评论
为什么被折叠?



