一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)
各位看官们。大家好,上一回中咱们说的是进程间同步与相互排斥的样例,这一回咱们说的样例是:使用信号量进行进程间同步与相互排斥。
闲话休提,言归正转。让我们一起talk C栗子吧!
看官们,信号量是由著名计算机科学家迪杰斯特拉(Dijkstra)提出的一种概念,专门用来解决进程间同步与相互排斥。在他提出的概念中信号量是一个非负整数值.
信号量的操作仅仅能有两种原子操作:
- 等待信号;
- 发送信号。
“什么是原子操作呢?”台下有看官在提问。原子操作就是指某个动作在运行时不能被其他动作中断,它会一直进行,直到该动作运行完毕为止。比方,我们在写代码的时候,突然收到一封邮件,这时候系统会临时中断写代码的程序vim(我用的是vim),然后让邮箱client发一个收到邮件的通知。然后再恢复到vim写代码的动作中。样例中使用vim写代码的动作就不是一个原子操作,仅仅有它不能被其他动作中断时,它才是一个原子操作。
接下来我们介绍对信号量的原子操作。
等待信号
等待信号也叫P操作。
例P(sem)表示对信号量sem进行P操作。
- 假设sem的值大于零,p操作会把sem的值减去1。
- 假设sem的值等于零,那么挂起运行p操作的进程;
发送信号
发送信号也叫V操作。比如V(sem)表示对信号量sem进行V操作。
- 假设有进程在由于等待sem而被挂起,那么唤醒等待的进程;
- 假设没有进程由于等待sem而被挂起。那么把sem的值加上1.
伪代码
以下是使用信号量进行进程同步与相互排斥的伪代码:
nocritical code //非临界区的代码
P(sem); //运行P操作,进入临界区。运行临界区中的代码
{
critical code; //临界区代码
do something
}
V(sem); //运行V操作,离开临界区
nocritical code //非临界区的代码
假设上面伪代码中的信号量sem值为1,进程A開始运行上面的伪代码。在进入临界区前先对信号量进行P操作,这时sem的值变为0,然后进程A运行临界区中的代码,这个时候进程B也開始运行上面的伪代码,在进入临界区前先对信号量进行P操作,这时进程A还没有离开临界区,信号量sem的值为零。进程B就会被挂起。直到进程A离开临界区运行V操作时,sem的值变为1,然后唤醒等待sem的进程B。接着进程B进入临界区而且运行临界区中的代码。
大家能够看到。通过信号量的P/V操作。能够保证在同一个时间内。仅仅有一个进程在运行临界区中的代码,也就是说实现了进程的同步与相互排斥。
看官们。本章回中就不写代码了。由于我们还没有介怎样使用信号量。在后面的章回中,我们会介绍信号量的操作。而且结合详细的样例,把伪代码转换成实际的代码。
各位看官,关于使用信号量进行进程间同步与相互排斥的样例咱们就讲到这里。欲知后面还有什么样例,且听下回分解 。
一起talk C栗子吧(第一百回:C语言实例--使用信号量进行进程间同步与相互排斥一)的更多相关文章
- 一起talk C栗子吧(第一百二十一回:C语言实例--线程知识体系图)
各位看官们.大家好,上一回中咱们说的线程属性的样例.这一回咱们说的样例是:线程知识体系图.闲话休提.言归正转. 让我们一起talk C栗子吧! 我们在前面的章回中介绍了与线程相关的知识,在今天的章回中 ...
- 一起talk C栗子吧(第十回:C语言实例--最小公倍数)
各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例. 闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们说的是最大公约数的样例,这一回咱们说的 ...
- 一起talk C栗子吧(第八十七回:C语言实例--使用管道进行进程间通信概述)
各位看官们,大家好.上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用管道进行进程间通信. 闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的的章回中介绍了使用管道进行进程 ...
- 一起talk C栗子吧(第八十四回:C语言实例--使用信号进行进程间通信一)
各位看官们,大家好,上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用信号进行进程间通信.闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在上一回中提到过进程之间通信须要解决的三 ...
- 一起talk C栗子吧(第九十六回:C语言实例--使用共享内存进行进程间通信二)
各位看官们.大家好,上一回中咱们说的是使用共享内存进行进程间通信的样例,这一回咱们接着上一回内容继续说使用共享内存进行进程间通信. 闲话休提,言归正转.让我们一起talk C栗子吧! 我们在上一回中介 ...
- 一起talk C栗子吧(第七回:C语言实例--进制转换)
各位看官们.大家好,从今天開始.我们讲大型章回体科技小说 :C栗子,也就是C语言实例. 闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们.上一回中咱们说的是生成随机数的样例.这一回咱们说的 ...
- 一起talk C栗子吧(第九十回:C语言实例--使用管道进行进程间通信三)
各位看官们,大家好,上一回中咱们说的是使用管道进行进程间通信的样例.这一回咱们说的样例是:使用管道进行进程间通信.只是使用管道的方式不同样.闲话休提,言归正转.让我们一起talk C栗子吧! 我们在前 ...
- 一起talk C栗子吧(第一百一十九回:C语言实例--线程死锁三)
各位看官们.大家好,上一回中咱们说的是线程死锁的样例,这一回咱们继续说该样例.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,由于篇幅的原因我们在上一回仅仅介绍了死锁发生的第一种原因,今天 ...
- 一起talk C栗子吧(第九十五回:C语言实例--使用共享内存进行进程间通信一)
各位看官们,大家好,上一回中咱们说的是SystemV IPC结构概述的样例,这一回咱们说的样例是:使用共享内存进行进程间通信. 闲话休提.言归正转.让我们一起talk C栗子吧! 共享内存是Syste ...
随机推荐
- VMware 彻底删除虚拟机操作系统的方法
方法一 首先,都需要点击左边的虚拟机列表,选中你要删除的操作系统 点击VMwae上方的虚拟机-管理-从硬盘删除. 方法二 右键左侧列表中要删除的系统-移除. 然后在硬盘上找到其所在文件夹,直接按SHI ...
- javaweb系列-关于HttpSessionListener的sessionDestroyed什么时候触发
根据书本写了下面这个监听器,然后开始调试,打开一个浏览器来访问该网页,可以正常触发sessionCreated,然后关闭浏览器,发现没有触发sessionDestroyed,然后我怀疑是不是这个监听器 ...
- Eclipse 总是在编译的时候卡住
之前在开发Unieap项目的时候都是很正常,突然有一天早上总是出现Eclipse在编译的时候卡到34%的位置. 解决办法: 点击停止校验,一直卡在那里,首先在任务管理器杀死eclipse和javaw进 ...
- Springboot 图标更换
1.将自己的logo图片转为.ico格式的,命名必须为[favicon.ico] 2.将该图片直接放在src/main/resourecs目录下 3.重启项目,刷新一下浏览器缓存,就会发现图标更换了
- 离散数学-集合的交并差集运算--STL-set类
代码其实很简单,我们只需要知道set类的使用方法就可以了,比如迭代器的定义( set<T>::iterator it=a.begin() ),和简单的insert函数插入,以及find函数 ...
- 解决mysql - 1577 问题
背景:通过navicat连接mysql使用events时报如下错误 登录mysql查询event mysql> use zhk4; Database changed mysql> show ...
- 用springmvc的@RequestBody和@ResponseBody 接收和响应json格式数据
1.controller @Controller @RequestMapping("/rest/v1") public class WelcomeController { @Req ...
- 【实验吧】转瞬即逝write up
---恢复内容开始--- 虽然这是很简单的一道题,但这是我第一次拿着题有很清晰的思路,并且脚本也有思路写,拿到文件用ida打开,分析main函数: int __cdecl main(int argc, ...
- string和数值之间的转换
string和数值之间的转换 to_string(val) 一组重载函数,返回数值val的string表示val可以是任何算数类型. stoi(s,p,b),stol(s,p,b),stoul(s,p ...
- 初识Web框架
一.Web框架本质 Python的Web框架分为两类: 通过socket自己写程序,自己处理请求: 基于Wsgi(Web Server Gateway Interface:Web服务网关接口),处理请 ...