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

进程间通信之信号量--使用信号实现生产者消费者问题

生产者消费者是数学中的一个经典的问题,也是编程中的一个经典问题。

本示例采用信号量来解决这个问题,其实,最终也就是进程之间同步的问题。

生产者源代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <sys/sem.h>

int sem_id;
void init()
{
key_t key;
int ret;
unsigned short sem_array[2];   //0代表生产者,1代表消费者
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
}arg;
key=ftok(".",'s');
sem_id=semget(key,2,0777|IPC_CREAT);
sem_array[0]=0;
sem_array[1]=100;
arg.array=sem_array;
ret=semctl(sem_id,0,SETALL,arg);
if(ret==-1)
{
perror("semctl");
exit(1);
}
printf("productor init is %d\n",semctl(sem_id,0,GETVAL));
printf("consumer  init is %d\n",semctl(sem_id,1,GETVAL));
}
void del()
{
semctl(sem_id,IPC_RMID,0);
}

int main()
{
struct sembuf sops[2];
int retv;
sops[0].sem_num= 0;
sops[0].sem_op  = 1;
sops[0].sem_flg = 0;
sops[1].sem_num= 1;
sops[1].sem_op  = -1;
sops[1].sem_flg = 0;
init();
printf("this is productor\n");
while(1)
{
printf("\n\nbefore produce\n");
printf("productor number is %d\n",semctl(sem_id,0,GETVAL));
printf("space number is %d\n",semctl(sem_id,1,GETVAL));
retv=semop(sem_id,&sops[1],1);
//if(retv==-1)
printf("no work semo on sops[0] retv%d\n",retv);
printf("now producting....\n");
retv=semop(sem_id,&sops[0],1);
//if(retv==-1)
printf("no work semo on sops[0] retv=%d\n",retv);
printf("\nafter produce\n");
printf("productor number is %d\n",semctl(sem_id,0,GETVAL));
printf("space number is %d\n",semctl(sem_id,1,GETVAL));
sleep(1);
}
del();
return 0;
}


 

消费者源代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <sys/sem.h>
int sem_id;
void init()
{
key_t key;
key=ftok(".",'s');
sem_id=semget(key,2,0777|IPC_CREAT);
}
int main()
{

struct sembuf sops[2];
sops[0].sem_num= 0;
sops[0].sem_op  = -1;
sops[0].sem_flg = 0;
sops[1].sem_num= 1;
sops[1].sem_op  = 1;
sops[1].sem_flg = 0;
init();
printf("this is customer\n");
while(1)
{
printf("\n\nbefore consumer\n");
printf("productor number is %d\n",semctl(sem_id,0,GETVAL));
printf("space number is %d\n",semctl(sem_id,1,GETVAL));
semop(sem_id,&sops[0],1);
printf("now consuming....\n");
semop(sem_id,&sops[1],1);
printf("\nafter consume\n");
printf("productor number is %d\n",semctl(sem_id,0,GETVAL));
printf("space number is %d\n",semctl(sem_id,1,GETVAL));
sleep(3);
}





return 0;
}

相关文章:

  • I/O复用--浅谈epoll
  • 图像类找工作面试题(二)——常见问题大总结
  • 【文章阅读】Frustratingly Simple Few-Shot Object Detection
  • 网络安全实战:记一次比较完整的靶机渗透
  • 双非本23秋招之路-从考研跑路到某安全大厂(无实习、项目)
  • 影响深度卷积神经网络算法的关键参数是网络结构
  • 微信小程序|使用小程序制作一个核酸检测点查询工具
  • Python3,5行代码,制作Gif动图,太简单了。
  • 【Python】字符串(简介)
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • 沉睡者IT - 十月之后「牛市」还是「熊市」
  • RK3566快速上手 | ROC-RK3566-PC开发板快速上手
  • MySQL备份测试
  • Redis学习(四)——主从复制、哨兵模式、缓存击穿、穿透、雪崩
  • C++语法——详细剖析类成员函数在内存中存储形式(包括静态)
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • CEF与代理
  • es的写入过程
  • ES学习笔记(12)--Symbol
  • extjs4学习之配置
  • iOS | NSProxy
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Javascript基础之Array数组API
  • javascript数组去重/查找/插入/删除
  • Python - 闭包Closure
  • spring boot 整合mybatis 无法输出sql的问题
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • yii2中session跨域名的问题
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 猴子数据域名防封接口降低小说被封的风险
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端之Sass/Scss实战笔记
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 仓管云——企业云erp功能有哪些?
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​卜东波研究员:高观点下的少儿计算思维
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (0)Nginx 功能特性
  • (2)MFC+openGL单文档框架glFrame
  • (33)STM32——485实验笔记
  • (C语言)字符分类函数
  • (LeetCode) T14. Longest Common Prefix
  • (二)windows配置JDK环境
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)原始图像数据和PDF中的图像数据
  • .net Stream篇(六)