为什么要有互斥(同步):多个线程共享资源时,需要确保每个线程看到一致的数据视图,否则可能产生不可预知的结果。
常见的互斥机制如表中所示
| 名称 | 类型 | 简述 | 优缺点 | 使用场景 |
| 原子操作 | 非睡眠锁 | 原子操作可以保证指令以原子的方式执行--执行过程不被打断,因此以原子操作的共享资源就不存在一致性问题。被操作的资源一般为4字节或者8字节的资源,一般用于对计数器进行保护。 | 优点:使用简单,指令以原子方式操作。操作资源时,不存在阻塞和自旋的状态。一种非常轻量级的互斥方法。常常用于实现计数器(使用其他互斥方案来包含计数器,显得杀鸡用了宰牛刀) 缺点:不适用于共享资源比较复杂的场景。 |
常用于对简单的全局变量进行保护(如:计数器)。 |
| 自旋锁 | 非睡眠锁 | 在thread1在获取锁时,如果锁已经被占用,则thread1进行自旋,此时CPU空转,白白占用CPU。 | 优点:获取不到锁时,任务自旋,不会睡眠,因此可以用在哪些不能睡眠的任务中(中断服务程序)。 缺点:获取不到锁时,任务自旋,浪费CPU资源。 |
被保护的资源操作简单时,即持有锁的时间比较短的情景。 |
| 读写 自旋锁 |
非睡眠锁 | 读写自旋锁在加锁前有三种状态,在这三种状态下加锁会有不同的结果: 1、写加锁状态:资源已经被thread1加了写锁,此时无论thread2是以写方式还是读方式加锁,则失败 |

本文探讨了在Linux环境下,多线程共享资源时的互斥同步问题,包括睡眠锁和非睡眠锁的工作原理及选择策略。同时,分析了死锁现象及其避免方法,并讨论了中断处理中锁的特殊处理。
最低0.47元/天 解锁文章
1024

被折叠的 条评论
为什么被折叠?



