互斥量:
多个线程同时访问共享数据时可能会冲突,这跟信号的可重性是同样的问题。如 果两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成:

1. 从内存读变量值到寄存器

2. 寄存器的值加1

3. 将寄存器的值写回内存

先举个例子:创建两个线程,各把counter增加5000次,正常情况下最后counter应该等于10000。

代码实现如下:

结果:

可以看到,每次运行程序的结果都不一样。说明在调用过程中发生了互斥现象。

解决办法:加互斥锁

实现多线程同步可以引互斥锁(Mutex,Mutual Exclusive Lock),获得锁的线程可以完成“读-修改-写”的操作,然后释放锁给其它线程,没有获得锁的线程只能等待不能访问共享数据,这样“读-修改-写”三步操作组成个原操作,要么都执,要么都不执,不会执到中间被打断,也不会在其它处理器上并做这个操作。 Mutexpthread_mutex_t类型的变量表,可以这样初始化和销毁。

相关函数如下:

pthread_mutex_init函 数初始化的Mutex可以pthread_mutex_destroy销毁。 如果Mutex变量是静态分配的(全局变量 或static变量),也可以宏定义PTHREAD_MUTEX_INITIALIZER来初始化,相当于 pthread_mutex_init初始化并且attr参数为NULL。 Mutex的加锁和解锁操作可以下列函数

一个线程可以调pthread_mutex_lock获得Mutex,如果这时另一个线程已经调pthread_mutex_lock获得了该Mutex,则当前线程需要挂起等待,直到另一个线程调pthread_mutex_unlock释放Mutex,当前线程被唤醒,才能获得该Mutex并继续执。如果这个线程既想获得锁,又不想挂起等待,可以调pthread_mutex_trylock,如果Mutex已经被 另一个线程获得,这个函数会失败返回EBUSY,不会使线程挂起等待。

现在给上一个例子加上互斥锁,代码如下:

运行结果如下:


可以看到,加锁后实现了线程同步。


死锁原理:

根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态。

死锁的四个必要条件:
1、互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
2、请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
3、非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
4、循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源

解决死锁的基本方法:

1、预防死锁:

资源一次性分配:(破坏请求和保持条件)

可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)。

资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)。

2、避免死锁:

预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。

3、检测死锁

首先为每个进程和每个资源指定一个唯一的号码;

然后建立资源分配表和进程等待表。

4、解除死锁:

当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:

剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;

撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。

转载于:https://blog.51cto.com/760470897/1766881

线程同步之——互斥量及死锁问题相关推荐

  1. 1线程同步:互斥量,死锁

     1线程为什么要同步 A:共享资源,多个线程都可对共享资源操作. B:线程操作共享资源的先后顺序不确定. C:处理器对存储器的操作一般不是原子操作. 2互斥量 mutex操作原语 pthread_ ...

  2. 线程同步之互斥量加锁解锁 死锁

    与互斥锁相关API       互斥量(mutex)从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁.对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻 ...

  3. 信号灯文件锁linux线程,linux——线程同步(互斥量、条件变量、信号灯、文件锁)...

    一.说明 linux的线程同步涉及: 1.互斥量 2.条件变量 3.信号灯 4.文件读写锁 信号灯很多时候被称为信号量,但个人仍觉得叫做信号灯比较好,因为可以与"SYSTEM V IPC的信 ...

  4. 并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发

    多线程: 多线程就是同时执行多个应用程序,需要硬件的支持 同时执行:不是某个时间段同时,cpu切换的比较快,所有用户会感觉是在同时运行 并发与并行: 并行(parallel):指在同一时刻,有多条指令 ...

  5. RTT的线程同步篇——互斥量

    野火RTT第20章互斥量 2018年12月29日 10:47 互斥量不能在中断服务程序中使用. 互斥量是特殊的二值信号量,其"特殊"在哪呢?互斥量不同于二值信号量的地方在于:互斥量 ...

  6. 线程同步之互斥量(互斥锁)

    1 同步的概念 所谓同步, 即同时起步,协调一致.不同的对象, 对"同步" 的理解方式略有不同. 如,设备同步,是指在两个设备之间规定一个共同的时间参考: 数据库同步, 是指让两个 ...

  7. Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)

    同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两 个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数据库内容 ...

  8. linux线程同步(1)-互斥量

    一.概述                                                   互斥量是线程同步的一种机制,用来保护多线程的共享资源.同一时刻,只允许一个线程对临界区进行 ...

  9. linux操作系统之线程同步及互斥量

    (1)线程同步 1)线程同步:指一个线程发出某一个功能运行时,在运行还没有结束的时候,该调用不返回.同时其它线程为保证数据的一致性,不能调用该功能. 2)多个控制流共同操作一个共享资源的时候,都需要同 ...

最新文章

  1. python画图小房子代码-python少儿编程-turtle 基本绘图
  2. elasticsearch中文分词器ik-analyzer安装
  3. python中复选框取消修改_python – 如何在PySide / PyQt中设置“只读复选框”
  4. 将联网方式更改为桥接模式
  5. 艾为数字ic面试题_秋招 应聘FPGA/数字IC笔试面试经验分享(简单列举FPGA/数字IC公司)...
  6. 大连市打造数字人民币应用示范村
  7. jbpm知识点——state
  8. 023-数据结构与算法系列
  9. 万字长文带你回顾电子游戏的七十多年历史(完整版)
  10. 利用 cookie,实现在html页面 记住我 功能
  11. C#获取本地IP地址
  12. NUC搭建Centos8服务器
  13. 【java】求一元二次方程的解
  14. 【MAC工具】各个Xcode版本对应macOS的版本下载
  15. 使用office的邮件合并和文档附件制作带照片的准考证
  16. SpringBoot2学习笔记
  17. 为什么不要把鸡蛋放在同一个篮子里?
  18. 【3D视觉原理】2-3D传感器原理
  19. linux redis 日志在哪里,Redis的日志系统
  20. linux磁盘配额步骤详细步骤,Linux磁盘配额命令及步骤.doc

热门文章

  1. 使用dumpsys检测Activity任务栈
  2. Windows 上看端口 找PID
  3. Axure RP 9.0 原型设计软件安装教程
  4. 图片二进制编码_python3从零学习-5.7.4、quopri编码与解码经过MIME转码打印数据
  5. 周长最短面积最大_圆内接三角形中,正三角形周长最大值的证明
  6. svnadmin: e000002: 无法创建最上层目录_JFolder::create: 无法创建目录
  7. android device monitor命令行窗口在哪里_Vulkan在Android使用Compute shader
  8. 计算机二级7月考试,2020年计算机二级MS Office考试每日一练(7月27日)
  9. html range关联文本框,HTML5gt;meter标签与input(type=range)标签结合制作简易范围指示器...
  10. 日志中的秘密 Windows登录类型知多少?