操作系统上机作业-- 使用信号量解决生产者、计算者、消费者问题(多线程)
pc2.c: 使用信号量解决生产者、计算者、消费者问题
• 功能和前面的实验相同,使用信号量解决
实现思路:
生产者、计算者、消费者三者之间的关系和上一个编程任务一样,不一样的是,将互斥量、条件变量封装起来作为信号量,处理方式基本和上一个编程任务一样
实现代码:
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>#define CAPACITY 4char buffer1[4];
char buffer2[4];int crea; //生产者
int comp1;//计算者
int comp2;//计算者
int cons; //消费者 int buffer1_is_empty(){return crea==comp1;
}int buffer1_is_full(){return (crea+1)%CAPACITY==comp1;
}int buffer2_is_empty(){return comp2==cons;
}int buffer2_is_full(){return (cons+1)%CAPACITY==comp2;
}int get_item1(){int item;item=buffer1[comp1];comp1=(comp1+1)%CAPACITY;return item;
}int get_item2(){int item;item=buffer2[cons];cons=(cons+1)%CAPACITY;return item;
}int put_item1(int item){buffer1[crea]=item;crea=(crea+1)%CAPACITY;
}int put_item2(int item){buffer2[comp2]=item;comp2=(comp2+1)%CAPACITY;
}typedef struct{int value;pthread_mutex_t mutex;pthread_cond_t cond;
}sema_t;void sema_init(sema_t *sema,int value){sema->value=value;pthread_mutex_init(&sema->mutex,NULL);pthread_cond_init(&sema->cond,NULL);
}void sema_wait(sema_t *sema){pthread_mutex_lock(&sema->mutex);sema->value--;while(sema->value<0)pthread_cond_wait(&sema->cond,&sema->mutex);pthread_mutex_unlock(&sema->mutex);
}void sema_signal(sema_t *sema){pthread_mutex_lock(&sema->mutex);++sema->value;pthread_cond_signal(&sema->cond);pthread_mutex_unlock(&sema->mutex);
}sema_t mutex_sema1;
sema_t empty_buffer1_sema;
sema_t full_buffer1_sema;sema_t mutex_sema2;
sema_t empty_buffer2_sema;
sema_t full_buffer2_sema;#define ITEM_COUNT (CAPACITY *2)void *consumer(void *arg){int i;int item;for(i=0;i<ITEM_COUNT;i++){sema_wait(&full_buffer2_sema);sema_wait(&mutex_sema2);item=get_item2();sema_signal(&mutex_sema2);sema_signal(&empty_buffer2_sema);printf(" consume item:%c\n",item);}return NULL;
}void *computer(void *arg){int i;int item;for(i=0;i<ITEM_COUNT;i++){sema_wait(&full_buffer1_sema);sema_wait(&mutex_sema1);item=get_item1();sema_signal(&mutex_sema1);sema_signal(&empty_buffer1_sema);printf(" computer get item:%c\n",item);sema_wait(&empty_buffer2_sema);sema_wait(&mutex_sema2);item-=32;put_item2(item);printf(" computer put item:%c\n",item);sema_signal(&mutex_sema2);sema_signal(&full_buffer2_sema);}return NULL;
}void create(){int i;int item;for(i=0;i<ITEM_COUNT;i++){sema_wait(&empty_buffer1_sema);sema_wait(&mutex_sema1);item=i+'a';put_item1(item);printf("create item:%c\n",item);sema_signal(&mutex_sema1);sema_signal(&full_buffer1_sema);}
}int main(){pthread_t computer_tid;pthread_t consumer_tid;sema_init(&mutex_sema1,1);sema_init(&empty_buffer1_sema,CAPACITY-1);sema_init(&full_buffer1_sema,0);sema_init(&mutex_sema2,1);sema_init(&empty_buffer2_sema,CAPACITY-1);sema_init(&full_buffer2_sema,0);pthread_create(&consumer_tid,NULL,consumer,NULL);pthread_create(&computer_tid,NULL,computer,NULL);create();pthread_join(consumer_tid,NULL);pthread_join(computer_tid,NULL);return 0;
}
欢迎留言交流。。。
操作系统上机作业-- 使用信号量解决生产者、计算者、消费者问题(多线程)相关推荐
- 操作系统课设--使用信号量解决生产者/消费者同步问题
山东大学操作系统课设lab3 实验三 使用信号量解决生产者/消费者同步问题(lab3) 实验目的 理解Nachos的信号量是如何实现的 生产者/消费者问题是如何用信号量实现的 在Nachos中是如何创 ...
- 青铜10:千锤百炼-如何解决生产者与消费者经典问题
欢迎来到<并发王者课>,本文是该系列文章中的第10篇. 在本篇文章中,我将为你介绍并发中的经典问题-生产者与消费者问题,并基于前面系列文章的知识点,通过wait.notify实现这一问题的 ...
- 并发王者课-青铜10:千锤百炼-如何解决生产者与消费者经典问题
欢迎来到<并发王者课>,本文是该系列文章中的第10篇. 在本篇文章中,我将为你介绍并发中的经典问题-生产者与消费者问题,并基于前面系列文章的知识点,通过wait.notify实现这一问题的 ...
- blockingdeque java_Java BlockingDeque解决生产者与消费者问题
BlockingDeque解决生产者与消费者问题的代码如下: import java.util.concurrent.BlockingDeque; import java.util.concurren ...
- 操作系统上机作业--使用条件变量解决生产者、计算者、消费者问题(多线程)
pc1.c: 使用条件变量解决生产者.计算者.消费者问题 /* • 系统中有3个线程:生产者.计算者.消费者 • 系统中有2个容量为4的缓冲区:buffer1.buffer2 • 生产者生产'a'.' ...
- Linux信号量与互斥锁解决生产者与消费者问题
先来看什么是生产者消费者问题: 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问 ...
- 操作系统-------用P,V操作解决生产者和消费者问题(详解!!!)
问题: 系统中有一组生产者进程和一组消费者进程,生产者每次生产一个产品放入缓冲区,消费者每次从缓冲区取出一个产品并使用(注:这里的产品可以理解成某种数据). 条件:生产者.消费者共享一 ...
- Linux学习之系统编程篇:使用信号量实现“生产者和消费者模型”
模型中,最为关键的步骤是,在生产者回调函数中,未生产之前,消费者回调函数是阻塞的,阻塞方式是条件变量. 那么不使用条件变量,如何使用"信号量"实现阻塞呢? 答案是因为调用 sem_ ...
- JAVA并发编程 之 LMAX Disruptor使用实例(高效解决生产者与消费者问题)
什么是Disruptor? Disruptor是一个开源的JAVA框架,它被设计用于在生产者-消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS) ...
最新文章
- 《松本行弘的程序世界》中文版原作者序
- springboot使用maven打包无法打进本地包解决方法
- JAVA复习5(TreeSet)
- array.slice_Ruby中带有示例的Array.slice()方法
- 信息学奥赛一本通(1220:单词接龙)
- IDEA编译时出现“cannot resolve symbol“的问题时的解决方法。
- Shell命令对整数求和,每行一个?
- TensorFlow中数据的feed与fetch
- class在java中_class在java里是什么意思
- proc sys文件系统对比
- ThoughtWorks 2018校招作业
- win10装sql2000卡在选择配置_如何在WIN10/SERVER2016上安装MSSQL2000数据库和新中大老版本软件...
- 测试语文读音标准的软件,普通话发音测试题库手机版apkv3.3.1安卓最新版
- 基于ESP32的蓝牙鼠标键盘(一)BleKeyboard.h函数解析
- vue组件可视化_Vue HTML5音频可视化组件
- 【论文精度】AutoBERT-Zero (使用NAS搜索预训练语言模型)
- 鲍思语:未来的汽车市场是年轻人的市场
- VMware Workstation 15 Pro 激活密钥
- 【温故而知新】分布式系统(一)
- openlayers加载Mapbox底图
热门文章
- 查看oracle的块大小,查看操作系统块大小
- 计算机ip地址未修复连接不了无线网络,本地连接没有有效的ip配置,教您修复本地连接没有有效的ip配置...
- 如何使用window.btoa base64对接口数组进行加密处理
- Bash脚本教程之mktemp 命令,trap 命令
- js中什么是对象,对象的概念是什么?
- 设计模式(二)模板方法模式
- 反射与二次加工标准类型
- 2019 The 19th Zhejiang University Programming Contest
- PHP ajax跨域问题最佳解决方案
- 爬虫(十二):scrapy中spiders的用法