互斥锁原理

简介: 互斥锁原理

如果有交互的公共数据区域,我们需要让一个进程先执行,一个进程后执行,互斥锁就是用锁的方式让他们的竞争关系变得有序。

临界区问题

临界区是在程序之间有公共数据交互时产生的区域,没有两个进程可以在它们各自的临界区同时执行

临界区的i协议

临界区管理准则

临界区必须有一个进程,因为如果临界区为空且满足互斥性那么其他进程都无法在临界区运行,临界区运行的程序也不能一直占用临界区,必须要让其他进程等待时间为有限的。

喂养金鱼问题

上面代码还是会有问题

那么这段代码的临界区在哪里

这楼里fish和feed变量都是公共的,所以这块区域就是临界区

我们修改这段伪代码,将异步尝试转为同步

这里这个note代表一个记号,表示正在判断是否喂鱼,remove note走时候撕掉记号。

但上个代码还是有问题

我们再次修改伪代码

但这里金鱼就不是撑死了,是饿死了

违反了有空让进原则

那么对于计算机系统来说,饿死好,还是撑死好呢?

对于计算机数据来说,我认为是饿死更好,因为撑死就等于数据被修改为错误了,而饿死代表计算机的数据并没有被修改。

我们再次修改伪代码

空循环,让alice等待tom移除note

我们再次分析

这里我自己对这个代码分析了一下:tom要执行需要满足alice没留下note,一但留下note,tom就无法喂食,而alice是一定会喂食的,所以这里需要alice这个设备性能比tom好

这两个算法和上面的算法思想是差不多的

互斥锁

一个进程拿到锁,其他进程如果与这个进程互斥,那么再要取得锁的使用权,就会进入loop状态,进程使用完需要释放锁

上锁和测试是不能被打断的

既然我们知道了上锁和测试是不可以被打断的,我们引用一个原子操作的概念

解决浪费cpu周期的缺点,我们可以将这个等待进程进入等待队列里,但是我们要注意,万一自旋的时间比切换队列消耗的时间更久,那么这个操作反而浪费了资源。

相关文章
|
21天前
|
安全 Java
深入Java并发编程:线程同步与互斥机制
【4月更文挑战第6天】Java并发编程中,确保数据一致性与防止条件竞争是关键。语言提供`synchronized`关键字、`Lock`接口和原子变量等机制处理并发问题。线程同步问题包括竞态条件、死锁和活锁。`synchronized`实现内置锁,`Lock`接口提供更灵活的锁管理,原子变量则支持无锁安全操作。理解并恰当使用这些工具能有效管理并发,避免数据不一致。
|
21天前
|
Linux API C++
c++多线程——互斥锁
c++多线程——互斥锁
|
6月前
|
API 调度 C语言
互斥锁,自旋锁,原子操作的原理,区别和实现
v互斥锁,自旋锁,原子操作的原理,区别和实现
35 0
|
21天前
|
测试技术 Go
互斥锁与读写互斥锁的妙用
互斥锁与读写互斥锁的妙用
39 0
|
11月前
读写锁原理解读(下)
读写锁原理解读(下)
读写锁原理解读(下)
|
21天前
|
安全 编译器
互斥锁的优化与应用
互斥锁的优化与应用
47 0
|
21天前
多线程并发锁的方案—互斥锁
多线程并发锁的方案—互斥锁
|
21天前
|
存储 缓存 编译器
C++11及上的原子操作底层原理与锁实现
C++11及上的原子操作底层原理与锁实现
156 0
|
9月前
|
调度 C++
如何使用C++11原子操作实现自旋锁
C++自旋锁是一种低层次的同步原语,用于保护共享资源的访问。自旋锁是一种轻量级的锁,适用于短时间的资源锁定。
173 1