各位看官们。大家好,上一回中咱们说的是进程间同步与相互排斥的样例,这一回咱们说的样例是:使用信号量进行进程间同步与相互排斥

闲话休提,言归正转。让我们一起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语言实例--使用信号量进行进程间同步与相互排斥一)的更多相关文章

  1. 一起talk C栗子吧(第一百二十一回:C语言实例--线程知识体系图)

    各位看官们.大家好,上一回中咱们说的线程属性的样例.这一回咱们说的样例是:线程知识体系图.闲话休提.言归正转. 让我们一起talk C栗子吧! 我们在前面的章回中介绍了与线程相关的知识,在今天的章回中 ...

  2. 一起talk C栗子吧(第十回:C语言实例--最小公倍数)

    各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例. 闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们说的是最大公约数的样例,这一回咱们说的 ...

  3. 一起talk C栗子吧(第八十七回:C语言实例--使用管道进行进程间通信概述)

    各位看官们,大家好.上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用管道进行进程间通信. 闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的的章回中介绍了使用管道进行进程 ...

  4. 一起talk C栗子吧(第八十四回:C语言实例--使用信号进行进程间通信一)

    各位看官们,大家好,上一回中咱们说的是进程间通信的样例.这一回咱们说的样例是:使用信号进行进程间通信.闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在上一回中提到过进程之间通信须要解决的三 ...

  5. 一起talk C栗子吧(第九十六回:C语言实例--使用共享内存进行进程间通信二)

    各位看官们.大家好,上一回中咱们说的是使用共享内存进行进程间通信的样例,这一回咱们接着上一回内容继续说使用共享内存进行进程间通信. 闲话休提,言归正转.让我们一起talk C栗子吧! 我们在上一回中介 ...

  6. 一起talk C栗子吧(第七回:C语言实例--进制转换)

    各位看官们.大家好,从今天開始.我们讲大型章回体科技小说 :C栗子,也就是C语言实例. 闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们.上一回中咱们说的是生成随机数的样例.这一回咱们说的 ...

  7. 一起talk C栗子吧(第九十回:C语言实例--使用管道进行进程间通信三)

    各位看官们,大家好,上一回中咱们说的是使用管道进行进程间通信的样例.这一回咱们说的样例是:使用管道进行进程间通信.只是使用管道的方式不同样.闲话休提,言归正转.让我们一起talk C栗子吧! 我们在前 ...

  8. 一起talk C栗子吧(第一百一十九回:C语言实例--线程死锁三)

    各位看官们.大家好,上一回中咱们说的是线程死锁的样例,这一回咱们继续说该样例.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,由于篇幅的原因我们在上一回仅仅介绍了死锁发生的第一种原因,今天 ...

  9. 一起talk C栗子吧(第九十五回:C语言实例--使用共享内存进行进程间通信一)

    各位看官们,大家好,上一回中咱们说的是SystemV IPC结构概述的样例,这一回咱们说的样例是:使用共享内存进行进程间通信. 闲话休提.言归正转.让我们一起talk C栗子吧! 共享内存是Syste ...

随机推荐

  1. 关于JDBC访问存储过程的问题

    最近开发一个应用,需要调用一个入参为List的存储过程. 存储过程为: proc_test(p1 OUT Number, p2 IN Number, p3 IN TAB_CUSTOMER); 这个Li ...

  2. Java随机产生中文昵称

    有时候我们注册一个网站第一次登陆系统会产生一个随机昵称供用户选择,在项目测试阶段遇到了这个问题,因为注册时没有让用户填写昵称,于是找了两种产生随机中文昵称的方法: 代码如下 package com.u ...

  3. Java8函数式编程和lambda表达式

    文章目录函数式编程JDK8接口新特性函数接口方法引用函数式编程函数式编程更多时候是一种编程的思维方式,是一种方法论.函数式与命令式编程区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉 ...

  4. Dreamoon and MRT

    Dreamoon and MRT 题目链接: http://codeforces.com/group/gRkn7bDfsN/contest/212299/problem/B 只需要考虑相对位置,设a0 ...

  5. MFC隐藏在黑暗之中的大坑

    大坑一:CDC会随着窗口状态的改变而改变 void K5::OnPaint() { CDC *pDC=this->GetDC(); //CDC最好设为局部变量 ... this->Rele ...

  6. 数据库课程设计 PHP web实现

    纪念一下自己写的东西.. 都说很垃圾就是了 直接用XAMPP做的 菜鸟网上学的PHP和HTML <!DOCTYPE html> <html> <head> < ...

  7. CSS中列表项list样式

    CSS列表属性 属性 描述 list-style-属性 用于把所有用于列表的属性设置于一个声明中. list-style-image 将图象设置为列表项标志. list-style-position ...

  8. focus,focusin,blur,focusout区别

    focus与focusin 1.共同点:当 <div> 元素或其任意子元素获得焦点时执行事件 2.区别:focus不支持冒泡,而focusin支持冒泡: blur与focusout 1.共 ...

  9. 浅谈stiring数

    在组合数学,Stirling数可指两类数,第一类Stirling数和第二类Stirling数. stirling常应用于许多组合枚举问题中. 第一类stirling数: 对第一类Stirling数   ...

  10. [LOJ] 分块九题 3

    https://loj.ac/problem/6279 区间修改,区间查询前驱. TLE无数,我觉得这代码最精髓的就是block=1000. 谜一样的1000. 两个启示: 块内可以维护数据结构,比如 ...