第三季-第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

时间: 2024-10-10 23:03:33

第三季-第17课-信号量同步编程的相关文章

第三季-第16课-信号量互斥编程

第16课-信号量互斥编程 16.1 公示栏问题(问题引入) 1. 问题描述 这里面我们举一个小例子.在一个班级里就有一个公示栏,A同学想写“数学课考试”,B同学想写“英语课取消”.但是有一个时间,A同学只写下了“数学课”三个字,没来得及写后面的内容就出去了,但是这个时候B同学来写下了“英语课取消”.这样让同学们看来就成了“数学课英语课取消”,给班级的其他同学造成了歧义. 这也就是我们说的同时访问一个资源,造成了,数据的混乱.若是有多个进程同时访问一个资源,同样会造成这个问题. 2. 问题程序化

第15课-信号量同步编程

1.进程同步:各进程按照一定的顺序执行的过程.异步就不一定有顺序,而是随机的执行.一组并发进程进行互相合作,互相等待,使得各进程按照一定的顺序执行的过程.2.system系统调用可以按照字符串方式调用系统命令.3.生产者只需要释放信号量:消费量只需要获取而不需要释放4.信号量初始值等于0,在互斥通讯中大于05.生产者:(1)创建信号量集合的键值(ftok函数)(2)创建信号量(semget函数)(3)设置信号量初始值为0(semctl(信号量ID,第几个信号量,什么操作[,欲设置的值])函数)(

Linux 信号量同步编程

前一篇文章概述了Linux 系统中信号量互斥编程,这篇文章正好是前一篇的姊妹篇----信号量同步.说它们是姊妹篇是因为它们都是利用了内核的信号量机制实现了进程间的通信.因为两者所解决的问题不同,因此它们使用的场景就会有所区别. 信号量互斥主要解决的问题是:进程间需要同时访问某种资源,但是它们对资源的操作会互相影响对方的操作结果,因此需要一种机制实现让进程在访问资源时能禁止其他进程访问相同的资源.而信号量同步则解决了另一个经典问题:生产者和消费者之间的协同工作问题. 首先描述一下生产者和消费者问题

信号量同步编程

信号量同步 一.核心概念 进程同步核心概念:一组并发进程进行互相合作,互相等待,使得各进程按一定的顺序执行的过程 称为进程间的同步. 二.生产力消费问题 (1)问题描述   (2)问题程序化    #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/sem.

第三季-第15课-信号通讯编程

第15课-信号通讯编程 15.1 核心理论 1. 信号 在古老的战场上,信号是最有效,最直接的通讯方式:在linux系统中,信号(signal)同样也是最古老的进程间通讯机制. 2. 信号处理流程 进程A/内核---(1)选择信号-----(2)发送信号-----(3)处理信号----进程B. 3. 信号类型 Linux系统支持的所有信号均定义在/usr/include/asm/signal.h(展示),其中常见的信号有: SIGKILL:杀死进程 SIGSTOP:暂停进程 SIGCHLD:子进

17岁开始学编程,晚么?

刚在伯乐在线上看到一篇文章: 有位年轻的童鞋在 Quora 提问,“如果想成为一名顶级程序员,17岁开始学编程晚么?”FB 前程序员 Don Pinkus 针对这个问题,分享他从 22 岁开始起学习编程的经历. 看完他的分享,截取对自己有帮助部分马克一下,查看原文(http://blog.jobbole.com/85548/) 如果你现在就希望自己成为一名工程师,那么以下就是你的任务清单: 1. 到w3schools.com网站上学习HTML和CSS.2. 思考一下你想做一个什么样的网站.已经有

BeagleBone Black板第六课:C++编程控制GPIO基础

BBB板第六课:C++编程控制GPIO基础 在一上课我们通过Shell脚本编程实现了对GPIO端口的简单输出控制,实现对两个LED指示灯的交替点亮和关闭,接下来的一两节课,将通过C++程序来实现Shell脚本的功能.为了实现对应的程序控制,我查阅了好多资料,测试过程中发觉网上的一些程序套用过来总是出现各种各样的编译错误,压根就控制不了BBB板,不知是我的BBB板太新,还是以前的程序太旧.最后还是从头开始,重新研究BBB板的文件系统,找出头文件,找出所有相关的函数,终于实现GPIO的C++程序控制

BeagleBone Black板第七课:GPIO编程控制

BBB板第七课:GPIO编程控制 在一上课我们通过IO函数做了简单的GPIO端口输出高低电平输出,实现对一个LED指示灯的点亮和关闭控制,本节将通过完整的C++程序,实现第四课Shell脚本的全部功能,实现两个LED指示灯的交替闪亮. 直接通过进入功能程序 1.实现echo 44 > export 打开端口功能 上一课简单测试中,通过手工在BBB板终端模式下打开gpio44端口可通过以下程序实现: #include <stdio.h> #define GPIO_DIR "/sy

第17课 - 对象的构造

第17课 - 对象的构造(上) 0. 问题 对象中成员变量的初始值是什么? 下面的类定义中成员变量 i 和 j 的初始值是什么?  对象定义在 全局空间.栈上.堆上,具有不同的属性. 1 #include <stdio.h> 2 3 class Test 4 { 5 private: 6 int i; 7 int j; 8 public: 9 int getI() { return i; } // 类成员函数,直接访问 10 int getJ() { return j; } 11 }; 12