目录

1 临界区

1.1 解决冲突的办法

2 互斥量

3 信号量

4 事件

5 总结


1 临界区

通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问

每个进程中访问临界资源的那段程序称为临界区一次仅允许一个进程使用的资源称为临界资源

优点:保证在某一时刻只有一个线程能访问数据的简便办法。

缺点:虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。

1.1 解决冲突的办法

  • 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入,如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待;
  • 进入临界区的进程要在有限时间内退出
  • 如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。

所谓“忙等”是指 “不让权”的等待,即进程因某事件的发生而无法继续执行时,它仍占有CPU,并通过不断地执行循环测试指令来等待该事件的完成。“忙等”的主要缺点是浪费CPU的时间,另外,它还可能引起预料不到的后果。

例如,考虑某个采取高优先权优先调度原则的系统,目前有两个进程A和B共享某个临界资源,A的优先权较高,B的优先权较低,且B已处于临界区内,而A欲进入自己的临界区,则A、B都不可能继续向前推进,陷入“死等”状态。

2 互斥量

为协调共同对一个共享资源的单独访问而设计的。互斥量跟临界区很相似,比临界区复杂,互斥对象只有一个,只有拥有互斥对象的线程才具有访问资源的权限。

优点:使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享

缺点:互斥量是可以命名的,也就是说它可以跨越进程使用,所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话,使用临界区会带来速度上的优势并能够减少资源占用量。

通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号量对象可以说是一种资源计数器。

3 信号量

为控制一个具有有限数量用户资源而设计。它允许多个线程在同一时刻访问同一资源,但是
需要限制在同一时刻访问此资源的最大线程数目
。互斥量是信号量的一种特殊情况,当信号量的最大资源数=1就是互斥量了。

优点:适用于对Socket(套接字)程序中线程的同步。

缺点:

  • 信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点;
  • 信号量机制功能强大,但使用时对信号量的操作分散, 而且难以控制,读写和维护都很困难,加重了程序员的编码负担;
  • 核心操作P-V分散在各用户程序的代码中,不易控制和管理,一旦错误,后果严重,且不易发现和纠正。

4 事件

用来通知线程有一些事件已发生,从而启动后继任务的开始

优点:事件对象通过通知操作的方式来保持线程的同步,并且可以实现不同进程中的线程同步操作。

5 总结

  • 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说互斥量可以跨越进程使用,但创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量 。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
  • 除临界区外,互斥量,信号量,事件都可以被跨越进程使用来进行同步数据操作。

进程/线程间的同步方式相关推荐

  1. 进程和线程的概念、区别及进程线程间通信

    进程与线程的概念,以及为什么要有进程线程,其中有什么区别,他们各自又是怎么同步的? 1. 基本概念: 进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发: 线程是进程 ...

  2. 线程间通信————同步

          同步 是指多个任务按照约定的先后次序 相互配合完成一件事情 信号量: 由信号量决定 线程是继续执行 还是阻塞等待 信号量代表某种资源 其值表示系统中该资源的数量 信号量是一个受保护的量 只 ...

  3. java线程间通信的方式

    java线程间通信的方式 1. 共享变量 2. 等待/通知 3. 管道流 1. 共享变量 volatile修饰的变量,线程间可见,可使用这种变量作为线程间传递消息的媒介: 延伸出来的,还有redis中 ...

  4. Python | threading03 - 使用条件对象,实现线程间的同步

    文章目录 一.前言 二.生产者-消费者的模型 2.1.代码 2.2.运行 2.3.wait( )方法会将互斥锁释放 三.条件同步 - threading.Condition( ) 3.1.相关API ...

  5. 父亲儿子女儿放取水果进程/线程间通信程序设计与实现

    父亲儿子女儿放取水果进程/线程间通信程序设计与实现 代码: #include<unistd.h> #include<stdio.h> #include<pthread.h ...

  6. NNG/NanoMsg进程线程间通讯库

    NNG/nanomsg 是最近项目上使用到的一个通信库,用来实现进程间过程调用和线程间通信,很是方便. NNG 是 nanomsg 的继任版本,而 nanomsg 则是流行的 ZMQ 的 C 重写版. ...

  7. 铂金04:令行禁止-为何说信号量是线程间的同步利器

    欢迎来到<并发王者课>,本文是该系列文章中的第17篇. 在并发编程中,信号量是线程同步的重要工具.在本文中,我将带你认识信号量的概念.用法.种类以及Java中的信号量. 信号量(Semap ...

  8. 进程(线程)间同步互斥问题(三) 熟睡的理发师问题

    问题描述: 熟睡的理发师问题描述的是多个进程(线程)之间的通信与同步问题: 有一个理发师的椅子,和n个顾客的椅子 如果有顾客在椅子上等,那么理发师为他剪发,否则理发师就在自己的椅子上睡觉. 如果理发师 ...

  9. Linux的进程/线程间通信方式总结

    Linux系统中的进程间通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程 ...

最新文章

  1. 多个错误多个tryexcept的处理异常处理
  2. SAP MM MB21 创建预留界面批量为多个行项目勾选M标记
  3. BZOJ 1815: [Shoi2006]color 有色图 [Polya DFS 重复合并]
  4. jquery父元素和子元素点击事件传递问题_不可把父元素的事件传递给子元素_事件无限循环传递...
  5. Flink shell报错 For input string: 0x100
  6. centos7升级openssh
  7. 中国科学家提出“探索极端宇宙”国际科学计划
  8. 我整理了10张超酷炫的可视化大屏,新手也能做,秀到没朋友
  9. 费用分摊分配用法(KSU5/KSV5/KB21N/KB11N)
  10. English总结(二)--英语常用单词
  11. WIFI接口定义知识介绍
  12. Android手机解网络锁软件,GalaxSIM解锁工具 GalaxSim Unlock
  13. 8255芯片+8254芯片实现硬延时跑马灯
  14. Linux C 函数参考(日期时间) 作者: 出处:hur.cn 更新时间: 2007年01月29日
  15. 空间句法插件Axwoman 6.3安装教程
  16. 分析称诺基亚仅押宝WP成自救牵绊
  17. D. Harmonious Graph【并查集】
  18. 虚拟机Linux CentOS 7安装配置Tomcat10(适用于安装任何tomcat版本!!)
  19. java正则表达式类_java中正则表达式之Pattern类与Matcher类
  20. round在python是什么意思_细说python中的round()方法

热门文章

  1. mysql新用户不能创建数据库中_MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限...
  2. 解决pytorch DataLoader 加载数据报错UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xe5 in position 1023
  3. 解决xlwt保存的xlsx文件无法打开的问题
  4. KNN代码复现python版
  5. php图像处理原生函数,php图像处理函数imagecopyresampled的用法
  6. wpf 图片绝对路径引用_Python Pillow 图片处理
  7. 贪吃蛇代码c语言改分,刚学C语言,想写一个贪吃蛇的代码
  8. 面向java开发者的函数式编程_函数式编程让你忘记设计模式
  9. kubernetes 磁盘、PV、PVC
  10. ubuntu16.04(其他版本也可)批量修改图片名---shell编程