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