线程同步问题(生产者与消费者C语言版)

生产者消费者问题算法的实现 阅读详情

线程同步问题

消费者与生产者

  • 一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。
  1. 有2个生产者线程,分别为P1、P2;有2个消费者线程,分别是C1、C2;缓冲区单元个数N=15;
  2. 不同的生产者可生产不同的产品(比如字母、数字、符号);不同的消费者可有不同的消费方式(比如“显示”、“打印”、“拼接成字符串”、“改变大小写”等)。自己可任意定义。
    功能要求:根据进程同步机制,编写一个解决上述问题的程序,显示缓冲池状态、放数据、取数据等过程。
#include<stdlib.h>
#include<pthread.h>
#include<semaphore.h>

#define BUFFER_SIZE 15
#define NUM_PRODUCERS 2
#define NUM_COMSUMERS 2


char buffer[BUFFER_SIZE];
int in = 0,out = 0;

sem_t empty;
sem_t full;

pthread_mutex_t mutex;

void produce(char item ,int id){
    printf("Producer %d produced item %c\n",id,item);
    buffer[in] = item;

    in = (in+1) % BUFFER_SIZE;
}
char consume(int id){
    char item = buffer[out];
    printf("Consumer %d consumed item %c\n",id,item);
    out = (out+1)%BUFFER_SIZE;
    return item;
}

void *producer(void *arg){
    int id = *(int *)arg;
    char item;

    while(1){
        item = 'A' + rand() % 26;
        sem_wait(&empty);
        pthread_mutex_lock(&mutex);
        produce(item,id);
        pthread_mutex_unlock(&mutex);
        sem_post(&full);
    }
    return NULL;
}

void *consumer(void *arg){
    int id = *(int *)arg;
    char item;
    while(1){
        sem_wait(&full);
        pthread_mutex_lock(&mutex);
        consume(id);
        pthread_mutex_unlock(&mutex);
        sem_post(&empty);
        if (item >= 'a' && item <= 'z') {
            item -= 'a' - 'A';
        }
    }

    return NULL;
}

int main(){
    sem_init(&empty,0,BUFFER_SIZE);
    sem_init(&full,0,0);
    pthread_mutex_init(&mutex,NULL);
    pthread_t producers[NUM_PRODUCERS];
    pthread_t consumers[NUM_COMSUMERS];
    int producer_ids[NUM_PRODUCERS];
    int consumer_ids[NUM_COMSUMERS];
    int i;
    for(i = 0;i<NUM_PRODUCERS;i++){
        producer_ids[i] = i+1;
        pthread_create(&producers[i],NULL,producer,&producer_ids[i]);
    }
        for(i = 0;i<NUM_COMSUMERS;i++){
        consumer_ids[i] = i+1;
        pthread_create(&consumers[i],NULL,consumer,&consumer_ids[i]);
    }
    for(i = 0;i<NUM_PRODUCERS;i++){
        pthread_join(producers[i],NULL);
    }
        for(i = 0;i<NUM_PRODUCERS;i++){
        pthread_join(consumers[i],NULL);
    }

   sem_destroy(&empty);
    sem_destroy(&full);
    pthread_mutex_destroy(&mutex);
    return 0;
}

运行结果
在这里插入图片描述

os作业实验报告 实验二 生产者――消费者问题算法的实现 一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。具体参数:有3个生产者进程,分别为P1和P2; 有4个消费者进程,分别是C1、C2和C3; 缓冲区单元个数N=22。不同的生产进程可生产不同的产品(比如阿拉伯数字,字母),不同的消费进程可有不同的消费方式(比如“改变数字大小”、“改变大小写”,“改变字母”等)。根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放数据、取数据 阅读详情

相关推荐

C#窗体模拟生产者消费者问题

目录模拟内容模拟思路实现方法编程实现运行结果 模拟内容 1、实现对经典的生产者—消费者问题的模拟,以便更好的理解此经典进程同步问题。生产者-消费者问题是著名的进程同步问题。它描述一组生产者向一组消费者提供产品,它们共享一个有界缓冲池,生产者的任务是向其中投放产品,消费者从中取得产品。 2、假定生产者和消费者是互相等效的,只要缓冲池未满,生产者就可以将生产出的产品放入其中;而只要缓冲池未空,消费者就可以从缓冲池中拿走产品。 3、生产者消费者进程同步,因为只有通过互通消息才知道是否能存入产品或者取走产品。他们之

qyh的博客 2072

生产者――消费者问题算法的实现

生产者――消费者问题算法的实现实验报告!!

weixin_52502839的博客 962

Linux下生产者消费者问题的C语言实现

操作系统的课程实验,在Linux下生产者-消费者问题的C语言实现。

Yuhan2001的优快云博客 9291

计算机操作系统

消费者生产者问题

xss1113333的博客 351

C语言之生产者与消费者模型

多线程并发应用程序有一个经典的模型,即生产者/消费者模型。系统中,产生消息的是生产者,处理消息的是消费者,消费者和生产者通过一个缓冲区进行消息传递。生产者产生消息后提交到缓冲区,然后通知消费者可以从中取出消息进行处理。消费者处理完信息后,通知生产者可以继续提供消息。 要实现这个模型,关键在于消费者和生产者这两个线程进行同步。也就是说:只有缓冲区中有消息时,消费者才能够提取消息;只有消息已被处理,

ZH0314的博客 1万+

C语言:生产者-消费者问题、读者-写者问题

1.生产者-消费者问题:题目要求 • 在 6.6.1 小节中,使用了三个信号量: empty (以记录有多少空位)、full (以记录有多少满位)以及 mutex (二进制信号量或互斥信号量,以保 护对缓冲插入与删除的操作)。对于本项目, empty 与 full 将采用标 准计数信号量,而 mutex 将采用二进制信号量。生产者与消费者作 为独立线程,在 empty、full、mut

linwh8的博客 8032

生产者消费者问题(Windows下C语言版)

学习学累了,打打代码放松一下。 生产者消费者问题Producer-consumer problem 也称有限缓冲问题,描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中...

= = 6615

多线程实现生产者与消费者模式

生产者-消费者模式的简介:在实际的软件开发过程中,我们将产生数据的模块称为生产者,处理数据的模块成为消费者。但仅有这两者还不够成为一个生产者-消费者模式,还需要有一个缓冲区(一段内存区域)作为中介,生产者产生的数据放入缓冲区,消费者从缓冲区读取数据并处理。(注:上述所说的模块是广义的,可以是类,函数,线程,进程等)我们可以将这二者之间的关系图表示出来:总结:我们用3-2-1的方法来简单描述一个生产者

YANG 1万+

C语言生产者与消费者问题

编写一个简单的生产者-消费者(producer-consumer)模型,其中包含一个生产者进程和一个消费者进程以及一个共享的缓冲区(使用队列或环形缓冲区)。其中 empty 的初始值应为缓存队列的大小,而 full 的初始值则应为 0。由于这是一个生产者-消费者模型的程序,最终的运行结果是不确定的。在该程序中,使用 PV 机制和互斥量来控制对缓存区的并发访问,保证了两个线程能够安全地使用共享数据组成的缓冲区。因此,最终的结果将取决于各种线程之间的执行顺序和时间分配。

jakelihua 5576

生产者与消费者问题

三个生产者向两个消费者提供消息,它们共享一个有界缓冲池,缓冲池有四个缓冲区,生产者向其中投放消息,消费者从中取得消息。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。每个缓冲设有一个所标记,生产者在生产产品以前要先判断缓冲区是否已上锁,消费者在消费产品之前也要进行判断

生产者 消费者 进程 可视化 java

以车库为例子,一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。 根据进程同步机制,编写一个解决上述问题的可视化程序,可显示缓冲池状态、放数据、取数据等过程。

[linux仓库]线程同步与生产者消费者模型[线程·陆]

文章通过图书馆钥匙管理的生动比喻,揭示了线程饥饿问题的成因,并详细讲解了pthread_cond_wait函数的两个关键特性:自动释放锁和重新竞争锁。在生产者消费者模型部分,作者提出了"321"原则(3种关系、2种角色、1个交易场所),并强调使用两个独立条件变量的必要性。通过阻塞队列的代码实现,展示了如何正确处理伪唤醒问题(使用while循环而非if判断)。最后,文章指出生产消费模型的高效性体现在生产和消费前后的并发执行,而非传递数据过程本身。附带的阻塞队列源码为实际应用提供了参考实现。

egoist2023的博客 1939

Android Camera Sensor HDR详解

本文详细介绍了Android相机传感器(Sensor)中实现高动态范围(HDR)采集的各种技术方式。主要内容包括: Sensor HDR技术分类 帧内HDR(Single-Frame HDR):在同一帧同一像素内完成多增益采集,无运动伪影和帧率损失,包括DAG(双模拟增益)、DCG(双转换增益)等技术 帧间HDR(Multi-Frame HDR):通过多帧曝光实现,如DOL(数字重叠)、Staggered HDR等 混合HDR:结合多种技术的复合方案 详细技术原理 重点解析了DAG和DCG两种主流帧内HDR

DU_YULIN的博客 361

【linux系统编程】线程同步+基于BlockingQueue的生产者消费者模型

在线程互斥写了一份抢票的代码,我们发现虽然加锁解决了抢到负数票的问题,但是一直都是一个线程在抢票,它错了吗,它没错但是不合理。那我们应该如何安全合理的抢票呢?引出来了线程同步,然后在学习生产者消费者模型,从多方面讲解什么是生产者消费者模型,生产者消费者的关系,到后来321原则。现在左手拿着生产者消费者模型,右手拿着互斥和同步,由此写了一份基于BlockQueue生产者消费者模型。并引出生产者消费者凭什么就是高效的,高效在哪里?它的意义在哪里?并且提出一个问题下一篇文章来解释!

fight_p的博客 1920

2024年下半年软考系统架构设计师案例分析题

摘要: 本文包含两个软件系统设计案例。案例一讨论了大语言模型智能系统的质量属性需求分析,识别了功能性、性能、可靠性等需求,并对比了ping/echo和心跳两种故障检测策略。案例二探讨了购物网站的缓存设计,包括Cache-Aside策略的数据读取/更新流程,以及解决缓存一致性的多种方案(消息队列、数据库插件、锁机制等)。此外还涉及Elasticsearch分词器的特点比较和RESTful架构实现前后端分离的原理。这些案例展示了软件架构设计中的质量属性权衡、缓存策略选择及系统解耦等关键技术考量。<|end

卿着飞翔 1047

一代测序、二代测序以及三代测序的优缺点及应用对比?

一、初现庐山真面目 一代测序:又称Sanger测序(多分子,单克隆) 历史:第一代DNA测序技术(又称Sanger测序)在1975年,由Sanger等人开创,并在1977年完成第一个基因组序列(噬菌体X174),全长5375个碱基。研究人员经过30年的实践并对技术及测序策略的不断改进(如使用了不同策略的作图法、鸟枪法),2001年完成的首个人类基因组图谱就是以改进了的Sanger法为其测序基础。 原理:在4个DNA合成反应体系(含dNTP)中分别加入一定比例带有标记的ddNTP(分为:ddATP...

wangprince2017 3万+

生产者与消费者问题C语言实现

实验目的 ①实现生产者—消费者问题的模拟,以便更好的理解此经典进程同步问题。生产者-消费者问题是典型的PV操作问题,假设系统中有一个比较大的缓冲池,生产者的任务是只要缓冲池未满就可以将生产出的产品放入其中,而消费者的任务是只要缓冲池未空就可以从缓冲池中拿走产品。缓冲池被占用时,任何进程都不能访问。 ②每一个生产者都要把自己生产的产品放入缓冲池,每个消费者从缓冲池中取走产品消费。在这种情况下,生...

徐奕的专栏 11万+

千兆以太网PHY设计:PCB原理图完整示例

深入解析千兆以太网PHY电路设计要点,提供完整的PCB原理图设计实例,帮助工程师掌握高速信号布局与电源去耦等关键技术,提升设计稳定性与信号完整性。

weixin_30633869的博客 634

【Linux】线程同步与生产消费者问题

【Linux】线程同步与生产消费者问题

cefler的博客 2524

手把手教你用GNU Radio和PlutoSDR搭建FM收音机(附完整流程图)

本文提供了一份详细的实践指南,教你如何使用GNU Radio和PlutoSDR搭建一个功能完整的FM收音机。从软硬件环境准备、核心流程图构建,到运行调试与效果优化,手把手带你完成从射频信号接收、下变频、FM解调到音频输出的全过程,是入门软件定义无线电(SDR)的绝佳实践项目。

weixin_29189377的博客 750

基于YOLOv8与UI界面的短视频内容审核系统实现与深度学习应用

YOLO(You Only Look Once)是一种用于实时物体检测的深度学习模型,它能在单次前向传播中同时完成物体检测和定位。YOLOv8是YOLO系列中的最新版本,相较于之前的版本,YOLOv8具有更高的检测精度和更快的推理速度,特别适合需要实时检测的应用场景。YOLOv8通过卷积神经网络(CNN)来提取图像中的特征,并通过多个卷积层来预测每个目标的位置和类别。该模型的优势在于其端到端的结构,使得在视频监控、自动驾驶、安防监控等实时应用中,能够实现快速且高效的目标检测。

YOLO 314

C语言实现生产者消费者问题(附带源码)

本文详细介绍了如何使用 C 语言实现生产者-消费者问题,从项目背景、实现思路、完整代码到详细函数解析,全面展示了多线程同步机制的实现过程。希望这篇博客文章能够为你提供有价值的参考,并激发你对并发编程、操作系统原理及 C 语言编程的兴趣。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 3824

2025.05.29【Network】多组学分析:网络互作图绘制

本文介绍了使用R语言进行网络图绘制的方法与技巧。重点讲解了三个核心R包的使用:igraph用于网络图数据准备与基础绘制,ggraph基于图形语法实现高级可视化,networkD3则为网络图添加交互功能。文章涵盖了从基本概念、包安装、创建网络图对象,到自定义样式布局、添加交互性等完整流程,并提供了度分布、聚类系数等网络分析指标的计算方法。通过清晰的代码示例,帮助读者掌握生物信息学数据可视化的关键技能,为复杂数据的直观展示和分析提供实用工具。

227

生产者-消费者问题及C语言实现

问题描述 生产者-消费者问题是最著名的进程同步问题。它描述了一组生产者与一组消费者,它们共享一个有界缓冲池,生产者向池中投入产品,消费者从池中取得产品。假定缓冲池中有 N 个缓冲区,每个缓冲区只能存放一个类型为 item 的产品,而所有的生产者和消费者是相互等效的,则需要为该问题设置三个信号量:互斥信号量 mutex,用于实现对缓冲池的互斥访问,其初值为 1;资源信号量 empty,用来表示

小弹弹的专栏 1万+

11 指挥AI写C语言/嵌入式基础代码,适配硬件与底层逻辑

本文为《30天掌控AI编程:从指令到落地,手把手教你指挥AI写代码》系列第十一篇,正式进入第三阶段多场景实战环节。聚焦**C语言/嵌入式基础代码**生成,结合嵌入式开发的核心需求,讲解如何精准编写指令,指挥AI生成适配硬件、贴合底层逻辑的C语言代码,覆盖嵌入式常用底层功能、硬件适配要点、代码规范,搭配完整指令模板、AI输出示例与实操校验方法,零基础也能快速指挥AI完成嵌入式基础开发,无需死记硬背C语言底层语法。

coreopt的博客 140

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

线程同步与互斥——生产者、消费者模型

本文介绍了生产者-消费者(CP)模型的核心概念及应用。该模型通过超市类比,阐述了三个优势:缓存提升效率、支持忙闲不均、实现生产消费解耦。在多线程环境下,生产者与消费者通过共享内存通信,需处理三种关系:生产者间互斥、消费者间互斥、生产消费间的同步互斥(321原则)。文章特别强调BlockingQueue的实现,通过队列上限和空状态控制,确保线程安全通信。该模型有效解决了并发环境下的资源竞争和协调问题,实现了高效安全的数据交换。

2301_80342122的博客 2413

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: jdk1.7 -> jdk 1.8 -> jdk 17 HashMap 源码剖析
下一篇: 统计英语六级中的高频单词
HFJsjsn
博客等级 码龄5年 43粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值