概念理解篇:线程同步之【互斥】
线程同步基本概念:
首先我们知道线程同步分为线程互斥与线程通信。
线程同步的意思就是确保多个线程按正确的顺序去获取资源并依次执行。
线程互斥的意思就是同一时刻只有一个线程可以访问共享资源(临界区),防止共享资源被多个线程同时访问造成数据覆盖从而崩溃。
------------------------今天我们只讲锁的概念和过程----------------------------
互斥:
锁主要分为互斥锁与自旋锁。
互斥锁又名:无忙等待锁,获取失败就放手了,闲的很。
自旋锁又名:忙等待锁,获取失败就一直while循环嘛,忙的很。
什么是互斥锁与自旋锁?
多线程编程中,这两把锁都是被线程获取后用来互斥访问共享资源的,同一时刻保证临界区只有一个线程去访问。
互斥锁与自旋锁的过程?
共同特性:
这两种锁,被线程获取成功后,只要当前线程不释放,其他线程就无法获取。
不同特性:
互斥锁加锁失败:内核把线程从运行态变为阻塞态,并放入等待队列中,把当前线程的CPU资源转让给其他线程,等到当前线程又获取到锁后,线程由阻塞态恢复就绪态,操作系统执行调度算法,把CPU资源转回给当前线程,继续任务的执行。
自旋锁加锁失败:当前线程会一直占有CPU资源进行循环等待,直到能获取到这把锁。
综上所述,两种锁的主要区别就是获取互斥锁的线程存在状态改变,也就是两次上下文切换。
什么时候使用互斥锁还是自旋锁?
当临界区也就是共享资源代码量比较少,线程持有锁的时间短,可以使用自旋锁,这样避免使用互斥锁(线程状态的变化从而进行两次上下文切换)提高效率。(CPU多核前提下)
注意:单核CPU不能使用自旋锁,因为获取自旋锁的线程不会放弃CPU资源,其他线程无法获取CPU。