美文网首页
OSSpinLock自旋锁

OSSpinLock自旋锁

作者: Jack_XY | 来源:发表于2017-06-27 16:41 被阅读0次

自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。

信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用(_trylock的变种能够在中断上下文使用),而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。

如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共巷资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。

自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。

跟互斥锁一样,一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。

无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。

OSSpinLock自旋锁的使用


//  OSSpinLock自旋锁的初始化
OSSpinLock _lock = OS_SPINLOCK_INIT;

//  锁定
OSSpinLockLock(&_lock);

// 解锁
OSSpinLockUnlock(&_lock);

相关文章

  • 线程锁

    自旋锁 一、OSSpinLock OSSpinLock叫做”自旋锁”,等待锁的线程会处于忙等(busy-wait)...

  • iOS各种锁总结

    OSSpinLock OSSpinLock自旋锁,因为自旋锁一直busy-waiting忙等待占用cpu,且不会像...

  • iOS 不安全的OSSpinLock锁

    iOS 不安全的OSSpinLock锁 OSSpinLock OSSpinLock 是自旋锁,等待锁的线程会处于忙...

  • 多线程复习

    自旋锁 & 互斥锁 自旋锁:atomic、OSSpinLock、dispatch_semaphore_t临界区加锁...

  • iOS 开发中加锁

    [1].OSSpinLock 自旋锁 [1]自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被...

  • OSSpinLock自旋锁

    自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是...

  • iOS 开发过程中8种锁

    OSSpinLock OSSpinLock 自旋锁,不会让等待的线程进入睡眠状态,效率高。OSSpinLock 不...

  • 6-4 锁与多线程

    锁的原因 @synchronized. 自旋锁。OSSpinLock NSLock 普通锁 NSRecursi...

  • IOS中的锁

    自旋锁:线程处于忙等状态,busy wait OSSpinLock叫做”自旋锁”,等待锁的线程会处于忙等(busy...

  • os_unfair_lock pthread_mutex

    OSSpinLock OSSpinLock叫做"自旋锁",等待锁的线程会处于忙等busy-wait状态.一直占用着...

网友评论

      本文标题:OSSpinLock自旋锁

      本文链接:https://www.haomeiwen.com/subject/kspecxtx.html