自旋锁和互斥锁

简介

  • 自旋锁是互斥锁的一种,一般的互斥锁会在等待期间放弃CPU,自旋锁(spinlock)则是不断循环并检测锁的状态,一直占着cpu。
  • 互斥锁:用于保护临界区,确保同一时间只有一个线程访问数据。对共享资源的访问,先对互斥量枷锁,如果互斥量已经上锁,调用线程会阻塞,直到互斥量被解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。
  • 临界区:每个进程中访问临界资源的那段程序称为临界区,每次只允许一个线程进入临界区,进入后不允许其他线程进入。
  • 自旋锁:与互斥量类似,不是通过休眠使进程阻塞,而是在获取锁之前一直处于忙等(自旋)阻塞状态,用在以下情况:锁持有时间段,而且线程不希望在重新调度上花太多成本。原地打转
  • 自旋锁和互斥锁的区别:线程在申请自旋锁时,线程不会被挂起,而是处于忙等状态。

特点

  • 互斥锁,访问共享资源前加锁,访问完成后解锁。加锁后,任何其他试图再次加锁的线程会被阻塞,直到当前线程解锁。
  • 自旋锁,当资源被加锁后,其他线程想要再次加锁,此时该线程不会被阻塞睡眠,而是陷入循环等待(CPU不能干别的),循环检测持有者是否释放了锁资源。好处是减少了线程从睡眠到唤醒的资源消耗,但会一直占用cpu资源,适用于资源的锁被持有时间短的情况

原理

  • 互斥锁属于sleep-waiting类型的锁,例如在双核机器上有两个线程A和B,分别运行在Core0和Core1上。假设线程A想要通过pthread_mutex_lock去得到一个临界区的锁,而此时这个锁正被B持有,那么线程A就会阻塞。Core0会在此时进行上下文切换,将线程A放到等待队列中,可以运行其他任务(例如线程C)。
  • 而自旋锁属于busy-waiting类型的锁。如果线程A是用pthread_spin_lock去申请锁,那么线程A就会一直在Core0上进行忙等待并不停进行锁请求,直到得到锁为止。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值