第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课-信号量同步编程相关推荐

  1. Emojify - v2 吴恩达老师深度学习第五课第二周编程作业2

    吴恩达老师深度学习第五课第二周编程作业2,包含答案! Emojify! Welcome to the second assignment of Week 2. You are going to use ...

  2. python自学之《21天学通Python》(14)——第17章 Web网站编程

    Web编程是程序设计应用之一,随着动态网站不断发展,Web编程已经成为程序设计的重要应用领域.目前Web编程主要有ASP.NET.PHP.Java等编程语言,Python语言也可以像其他语言一样应用于 ...

  3. AI一分钟 | 教育部公布高中新课标,编程、算法思维成必修内容;李彦宏否认百度会“All in AI”

    一分钟AI 李彦宏表示自己做事一向留有余地,否认百度会"All in AI". 教育部发布最新高中课程改革方案,对学生在编程.算法.人工智能和开源硬件方面的要求大幅度提升. 罗永浩 ...

  4. JS笔记(20): JS中的同步编程和异步编程

    铺垫:关于定时器 定时器:设定一个定时器,并且设定了等到的时间,当到达指定的时间,浏览器会把对应的方法执行 1)常用的定时器 1.setTimeout(function,intarval) 执行一次 ...

  5. Linux 线程信号量同步

    https://www.cnblogs.com/jiqingwu/p/linux_semaphore_example.html 信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信 ...

  6. Linux多线程——使用信号量同步线程

    http://blog.csdn.net/ljianhui/article/details/10813469/ 信号量.同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过是同步的对 ...

  7. 微课|《Python编程基础与案例集锦(中学版)》第5章例题讲解(1)

    适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 京东图书地址:https://item.jd.com/12571990.html 当当图书地址:h ...

  8. 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(3)

    适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 例4-10  把十进制数转换为其他进制形式. 例4-11  验证6174猜想. 例4-12.例4- ...

  9. 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(2)

    适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 例4-4 例4-5 例4-6 微课|中学生可以这样学Python(例4.3):百钱买百鸡 例4-7 ...

  10. 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(1)

    适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 例4-1 例4-2 例4-3 京东图书地址:https://item.jd.com/1257199 ...

最新文章

  1. 远程安装oracle 10.2.1 for redhat 5.0 2.6.18-53.el5xen【转】
  2. SQL注入原理深度解析
  3. ThreadLocal可能引起的内存泄露
  4. Java开发高性能网站需要关注的事
  5. shell关闭指定进程
  6. 生活中的算法的实际举例_驾校学的技术,在实际生活中,你能运用自如吗?
  7. 用启动易合并启动光盘图解教程
  8. ZooKeeper 3.5.5 基础使用
  9. C#操作SQLite数据库
  10. css学习_css用户界面样式
  11. cmk聪明客机器人餐厅_住了10年的老房大改造,45客餐厅全开放,更有整面大衣柜,高级又实用!...
  12. shell输出重定向
  13. iphone 目录大全
  14. W3Cschool导航条练习
  15. 文件二维码:在线直接扫一扫二维码查看下载资料
  16. 方差(variance)、标准差(Standard Deviation)、均方差、均方根值(RMS)、均方误差(MSE)、均方根误差(RMSE)
  17. 帆软折线图设置红色警戒线
  18. 小程序“成语猜题”部分答案
  19. 达克效应:无知要比知识更容易产生自信
  20. 上位机UI界面设计项目

热门文章

  1. 数据结构--数组+链表实现哈希表
  2. Volley源码解析(一)
  3. 实时即未来!Flink Forward Asia 2021 议程正式上线!
  4. H.264标准(一)MP4封装格式详解
  5. yii mysql 操作_YII 数据库相关操作
  6. 手工画图和计算机画图的内在联系,浅谈计算机绘图有关的论文(2)
  7. beamer插入图片_利用Pandoc将Markdown转化为beamer(七)Pandoc的命令行参数
  8. python高维数据存储_Numpy高维数据的理解
  9. python中‘configparser’的使用方法---ini文件读取方法
  10. php如何从获取数据,如何从​​获取值并保存到php的数据库