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;
}


欢迎留言交流。。。

操作系统上机作业-- 使用信号量解决生产者、计算者、消费者问题(多线程)相关推荐

  1. 操作系统课设--使用信号量解决生产者/消费者同步问题

    山东大学操作系统课设lab3 实验三 使用信号量解决生产者/消费者同步问题(lab3) 实验目的 理解Nachos的信号量是如何实现的 生产者/消费者问题是如何用信号量实现的 在Nachos中是如何创 ...

  2. 青铜10:千锤百炼-如何解决生产者与消费者经典问题

    欢迎来到<并发王者课>,本文是该系列文章中的第10篇. 在本篇文章中,我将为你介绍并发中的经典问题-生产者与消费者问题,并基于前面系列文章的知识点,通过wait.notify实现这一问题的 ...

  3. 并发王者课-青铜10:千锤百炼-如何解决生产者与消费者经典问题

    欢迎来到<并发王者课>,本文是该系列文章中的第10篇. 在本篇文章中,我将为你介绍并发中的经典问题-生产者与消费者问题,并基于前面系列文章的知识点,通过wait.notify实现这一问题的 ...

  4. blockingdeque java_Java BlockingDeque解决生产者与消费者问题

    BlockingDeque解决生产者与消费者问题的代码如下: import java.util.concurrent.BlockingDeque; import java.util.concurren ...

  5. 操作系统上机作业--使用条件变量解决生产者、计算者、消费者问题(多线程)

    pc1.c: 使用条件变量解决生产者.计算者.消费者问题 /* • 系统中有3个线程:生产者.计算者.消费者 • 系统中有2个容量为4的缓冲区:buffer1.buffer2 • 生产者生产'a'.' ...

  6. Linux信号量与互斥锁解决生产者与消费者问题

    先来看什么是生产者消费者问题: 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问 ...

  7. 操作系统-------用P,V操作解决生产者和消费者问题(详解!!!)

    问题:         系统中有一组生产者进程和一组消费者进程,生产者每次生产一个产品放入缓冲区,消费者每次从缓冲区取出一个产品并使用(注:这里的产品可以理解成某种数据). 条件:生产者.消费者共享一 ...

  8. Linux学习之系统编程篇:使用信号量实现“生产者和消费者模型”

    模型中,最为关键的步骤是,在生产者回调函数中,未生产之前,消费者回调函数是阻塞的,阻塞方式是条件变量. 那么不使用条件变量,如何使用"信号量"实现阻塞呢? 答案是因为调用 sem_ ...

  9. JAVA并发编程 之 LMAX Disruptor使用实例(高效解决生产者与消费者问题)

    什么是Disruptor? Disruptor是一个开源的JAVA框架,它被设计用于在生产者-消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS) ...

最新文章

  1. 《松本行弘的程序世界》中文版原作者序
  2. springboot使用maven打包无法打进本地包解决方法
  3. JAVA复习5(TreeSet)
  4. array.slice_Ruby中带有示例的Array.slice()方法
  5. 信息学奥赛一本通(1220:单词接龙)
  6. IDEA编译时出现“cannot resolve symbol“的问题时的解决方法。
  7. Shell命令对整数求和,每行一个?
  8. TensorFlow中数据的feed与fetch
  9. class在java中_class在java里是什么意思
  10. proc sys文件系统对比
  11. ThoughtWorks 2018校招作业
  12. win10装sql2000卡在选择配置_如何在WIN10/SERVER2016上安装MSSQL2000数据库和新中大老版本软件...
  13. 测试语文读音标准的软件,普通话发音测试题库手机版apkv3.3.1安卓最新版
  14. 基于ESP32的蓝牙鼠标键盘(一)BleKeyboard.h函数解析
  15. vue组件可视化_Vue HTML5音频可视化组件
  16. 【论文精度】AutoBERT-Zero (使用NAS搜索预训练语言模型)
  17. 鲍思语:未来的汽车市场是年轻人的市场
  18. VMware Workstation 15 Pro 激活密钥
  19. 【温故而知新】分布式系统(一)
  20. openlayers加载Mapbox底图

热门文章

  1. 查看oracle的块大小,查看操作系统块大小
  2. 计算机ip地址未修复连接不了无线网络,本地连接没有有效的ip配置,教您修复本地连接没有有效的ip配置...
  3. 如何使用window.btoa base64对接口数组进行加密处理
  4. Bash脚本教程之mktemp 命令,trap 命令
  5. js中什么是对象,对象的概念是什么?
  6. 设计模式(二)模板方法模式
  7. 反射与二次加工标准类型
  8. 2019 The 19th Zhejiang University Programming Contest
  9. PHP ajax跨域问题最佳解决方案
  10. 爬虫(十二):scrapy中spiders的用法