很多人搞不清自旋锁和互斥锁的区别,这两种锁都是最底层的锁实现。是很多高级锁的基础。
为什么需要锁?
共享资源是有限的,且同一时间只能有一方占用。就像我们常见的共享单车,它是多人共用的,但是在某个时刻,只能有一个人使用,当我们扫码的时候,它只属于我们,其他人不能占用。这就是加锁的意义。为了保证系统中的共享资源在一个时刻只能有一个线程访问,避免多线程同时使用导致的数据错乱。
锁是谁加的?
任何操作都是由内核完成,线程向内核申请加锁,是否能锁住是由内核决定的。
互斥锁
假设我们目前有两个进程,进程A和进程B。当A需要枷锁的时候会向内核申请获取锁,获取成功后独占互斥锁,进行自己的任务执行。此时B想要获取锁,但此时锁被A占用,所以获取失败,内核将现成B置为休眠状态。等到进程A执行完毕释放锁之后,内核在核实的时机唤醒进程B,成功获取锁后继续执行。
https://blog.youkuaiyun.com/qq_37935909/article/details/108625508
需要注意的是在进程B加锁失败后,会从用户态陷入内核态,让内核切换线程,简化了使用锁的难度,但是对性能存在影响。
当两个线程属于同一个进程,因为内存是共享的,所以在切换时虚拟内存这些资源保持不动,只切换线程的私有数据、寄存器等不共享的数据。
上下文的切换耗时比较短,只有几十纳秒到几微秒。如果加锁部分运行的代码比较短,有可能