一、自旋锁
1.1解释
自旋锁和互斥锁比较类似,都是为了解决对 某项资源的互斥使用,无论是自旋锁还是互斥锁,在任何时刻,最多只能有一个保持者,使用互斥锁,如果资源申请者拿不到锁,那么只能进入睡眠状态,但是自旋锁不会引起调用者睡眠,会一直处于忙等待过程中,消耗cpu资源
二、互斥锁
2.1解释
是用来解决线程间的同步和互斥问题的一种机制,当一个线程占用了当前共享资源,使用互斥锁将其上锁后,其他线程无法访问,必须等到unlock之后,其他线程才能利用共享资源里的内容,互斥锁是睡眠的,不是忙等锁
三、信号量
3.1解释
是用来解决进程和线程之间同步和互斥问题的一种通信机制,保证两个或多个关键代码不被并发调用,信号量是选择休眠的方式对共享工作停止访问的。如果共享资源是可用的,那么信号量的值为正数,如果不可用,信号量的值为0,一共有两种操作:P操作(请求访问保护资源)和V操作(释放保护资源),P操作会使信号量-1,V操作会使信号量+1
四、原子操作
4.1解释
最小的不允许被其他中断打断的操作,一旦被其他中断打断就不能还原,原子操作常用来保护多线程操作变量值:
五、completion机制
5.1解释
轻量级的同步机制,允许一个线程告诉另一个线程某个工作已经做完了,但是效果比信号量好,具体好在什么地方,参考链接:
5.2使用方法
六、对比
6.1互斥锁和信号量对比
(1)信号量一般以同步的方式对共享资源进行控制,而互斥锁通过互斥的方式对共享资源进行控制
(2)信号量可以对进程的共享资源进行控制,而互斥锁不可以
(3)信号量的值为非负整数,而互斥锁的值只能为0或1
(4)互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到
6.2自旋锁和互斥锁的区别
(1)因为自旋锁不会引起调用者睡眠,所以效率比较高
(2)自旋锁比较适用于锁使用者保持锁时间比较短的情况
(3)自旋锁容易造成死锁,所以需要安全使用它