第三季-第17课-信号量同步编程
第17课-信号量同步编程
17.1 核心概念--进程同步
一组并发进程进行互相合作、互相等待,使得各进程按一定的顺序执行的过程称为进程间的同步。
17.2 生产者消费者问题
1. 问题描述
这里面有两个角色:生产者和消费者。假设生产者生产的产品需要两步才能完成并且使用。但是,当生产者刚刚完成了对产品的第一步加工的时候,产品就被消费者买走了。可是他们之间并没有相应的沟通,这就导致,消费者会以为他买到了完成的产品。
2. 程序化
在文件夹里面创建producer.c和customer.c文件,同时创建文件夹ship。
producer.c
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
void main()
{
int fd;
//1.创建产品--文件
fd = open("./product.txt",O_RDWR|O_CREAT,0775);
//2.休息
sleep(20);
//3.向产品文件中填充内容
write(fd,"the product is finished!",25);
//4.关闭文件
close(fd);
}
customer.c
#include<stdlib.h>
void main()
{
//取走产品文件
system("cp ./product.txt ./ship");
}
运行结果:在两个一样的终端中分别运行./producer和./customer文件,我们会在文件夹/ship中,找到空白的文件product.txt。
3. 加入同步控制量
我们设置信号量的初始值是0,只有当生产者完成程序运行的时候才是1,这样就能解决问题。
./producer.c
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/sem.h>
void main()
{
int fd;
key_t key;
int semid;
struct sembuf sops;
//键值的设置
key = ftok("/root",2);
//创建信号量
semid = semget(key,1,IPC_CREAT);
//设置初始值为0
semctl(semid,0,SETVAL,0);
//创建产品--文件
fd = open("./product.txt",O_RDWR|O_CREAT,0775);
//休息
sleep(20);
//向产品文件中填充内容
write(fd,"the product is finished!",25);
//关闭文件
close(fd);
//释放信号量
sops.sem_num = 0 ;
sops.sem_op = 1;
sops.sem_flg = SEM_UNDO;
semop(semid,&sops,1);
}
./customer
#include<stdlib.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/types.h>
void main()
{
key_t key;
int semid;
struct sembuf sops;
int ret;
//键值的设置
key = ftok("/root",2);
semid = semget(key,1,IPC_CREAT);
//获取信号量
sops.sem_num = 0 ;
sops.sem_op = -1;
sops.sem_flg = SEM_UNDO; /*缺少这一项,可能成功,也可能失败,这里要是不设置它,会失败*/
//SEM_UNDO表示当程序,用这个信号量出错的时候,系统帮你释放掉这个信号量。
ret = semop(semid,&sops,1);
printf("ret is %d!\n",ret); /*显示0表示成功,显示-1表示失败*/
//取走产品文件
system("cp ./product.txt ./ship");
}
运行结果:在两个一样的终端中分别运行./producer和./customer文件,我们会看到./customer程序的等待,我们还在/ship文件夹中找到文件product.txt,它里面的内容是:the product is finished!
转载于:https://www.cnblogs.com/free-1122/p/11351543.html
第三季-第17课-信号量同步编程相关推荐
- Emojify - v2 吴恩达老师深度学习第五课第二周编程作业2
吴恩达老师深度学习第五课第二周编程作业2,包含答案! Emojify! Welcome to the second assignment of Week 2. You are going to use ...
- python自学之《21天学通Python》(14)——第17章 Web网站编程
Web编程是程序设计应用之一,随着动态网站不断发展,Web编程已经成为程序设计的重要应用领域.目前Web编程主要有ASP.NET.PHP.Java等编程语言,Python语言也可以像其他语言一样应用于 ...
- AI一分钟 | 教育部公布高中新课标,编程、算法思维成必修内容;李彦宏否认百度会“All in AI”
一分钟AI 李彦宏表示自己做事一向留有余地,否认百度会"All in AI". 教育部发布最新高中课程改革方案,对学生在编程.算法.人工智能和开源硬件方面的要求大幅度提升. 罗永浩 ...
- JS笔记(20): JS中的同步编程和异步编程
铺垫:关于定时器 定时器:设定一个定时器,并且设定了等到的时间,当到达指定的时间,浏览器会把对应的方法执行 1)常用的定时器 1.setTimeout(function,intarval) 执行一次 ...
- Linux 线程信号量同步
https://www.cnblogs.com/jiqingwu/p/linux_semaphore_example.html 信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信 ...
- Linux多线程——使用信号量同步线程
http://blog.csdn.net/ljianhui/article/details/10813469/ 信号量.同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过是同步的对 ...
- 微课|《Python编程基础与案例集锦(中学版)》第5章例题讲解(1)
适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 京东图书地址:https://item.jd.com/12571990.html 当当图书地址:h ...
- 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(3)
适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 例4-10 把十进制数转换为其他进制形式. 例4-11 验证6174猜想. 例4-12.例4- ...
- 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(2)
适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 例4-4 例4-5 例4-6 微课|中学生可以这样学Python(例4.3):百钱买百鸡 例4-7 ...
- 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(1)
适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 例4-1 例4-2 例4-3 京东图书地址:https://item.jd.com/1257199 ...
最新文章
- 远程安装oracle 10.2.1 for redhat 5.0 2.6.18-53.el5xen【转】
- SQL注入原理深度解析
- ThreadLocal可能引起的内存泄露
- Java开发高性能网站需要关注的事
- shell关闭指定进程
- 生活中的算法的实际举例_驾校学的技术,在实际生活中,你能运用自如吗?
- 用启动易合并启动光盘图解教程
- ZooKeeper 3.5.5 基础使用
- C#操作SQLite数据库
- css学习_css用户界面样式
- cmk聪明客机器人餐厅_住了10年的老房大改造,45客餐厅全开放,更有整面大衣柜,高级又实用!...
- shell输出重定向
- iphone 目录大全
- W3Cschool导航条练习
- 文件二维码:在线直接扫一扫二维码查看下载资料
- 方差(variance)、标准差(Standard Deviation)、均方差、均方根值(RMS)、均方误差(MSE)、均方根误差(RMSE)
- 帆软折线图设置红色警戒线
- 小程序“成语猜题”部分答案
- 达克效应:无知要比知识更容易产生自信
- 上位机UI界面设计项目
热门文章
- 数据结构--数组+链表实现哈希表
- Volley源码解析(一)
- 实时即未来!Flink Forward Asia 2021 议程正式上线!
- H.264标准(一)MP4封装格式详解
- yii mysql 操作_YII 数据库相关操作
- 手工画图和计算机画图的内在联系,浅谈计算机绘图有关的论文(2)
- beamer插入图片_利用Pandoc将Markdown转化为beamer(七)Pandoc的命令行参数
- python高维数据存储_Numpy高维数据的理解
- python中‘configparser’的使用方法---ini文件读取方法
- php如何从获取数据,如何从​​获取值并保存到php的数据库