天天看点

学习笔记 | 互斥锁和自旋锁

互斥锁(mutexlock):

  • 最常使用于线程同步的锁;标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁;
  • 临界区和互斥量都可用来实现此锁,通常情况下锁操作失败会将该线程睡眠,等待锁释放时被唤醒。

在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。

  • 互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只有两种状态,即上锁( lock )和解锁( unlock )。
  1. 原子性:把一个互斥量锁定为一个原子操作,这意味着操作系统(或

    pthread函数库

    )保证了如果一个线程锁定了一个互斥量,没有其他线程在同一时间可以成功锁定这个互斥量;
  2. 唯一性:如果一个线程锁定了一个互斥量,在它解除锁定之前,没有其他线程可以锁定这个互斥量;
  3. 非繁忙等待:如果一个线程已经锁定了一个互斥量,第二个线程又试图去锁定这个互斥量,则第二个线程将被挂起(不占用任何cpu资源),直到第一个线程解除对这个互斥量的锁定为止,第二个线程则被唤醒并继续执行,同时锁定这个互斥量。

自旋锁(spinlock):

  • 同样用来标记只能有一个线程访问该对象,在同一线程多次加锁操作会造成死锁;使用硬件提供的

    swap指令

    test_and_set指令

    实现;
  • 同互斥锁不同的是在锁操作需要等待的时候并不是睡眠等待唤醒,而是循环检测保持者已经释放了锁,互斥量阻塞后休眠让出cpu,而自旋锁阻塞后不会让出cpu,会一直忙等待,直到得到锁。
  • 这样做的好处是节省了线程从睡眠状态到唤醒之间内核会产生的消耗,在加锁时间短暂的环境下这点会提高很大效率。适用于锁的持有时间比较短。

继续阅读