自旋鎖是專為防止多處理器并發(fā)而引入的一種鎖霍衫,它在內(nèi)核中大量應(yīng)用于中斷處理等部分(對于單處理器來說,防止中斷處理中的并發(fā)可簡單采用關(guān)閉中斷的方式家卖,即在標(biāo)志寄存器中關(guān)閉/打開中斷標(biāo)志位芹枷,不需要自旋鎖)弟孟。
自旋鎖汁咏,和互斥鎖類似,都是為了保證線程安全的鎖作媚。但二者的區(qū)別是不一樣的攘滩,對于互斥鎖,當(dāng)一個線程獲得這個鎖之后纸泡,其他想要獲得此鎖的線程將會被阻塞漂问,直到該鎖被釋放。但自旋鎖不一樣女揭,當(dāng)一個線程獲得鎖之后级解,其他線程將會一直循環(huán)在哪里查看是否該鎖被釋放。所以田绑,此鎖比較適用于鎖的持有者保存時間較短的情況下勤哗。
部分代碼如下:
以下代碼要導(dǎo)入以下頭文件
#import <libkern/OSAtomic.h>
#import <os/lock.h>
#import <AddressBook/AddressBook.h>
// 自旋鎖
- (void)OSSpinLock {
// spinLock = OS_SPINLOCK_INIT;
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// NSLog(@"線程1 準備上鎖");
// OSSpinLockLock(&spinLock);
// sleep(4);
// NSLog(@"線程1");
// OSSpinLockUnlock(&spinLock);
// NSLog(@"線程1 解鎖成功");
// NSLog(@"----------------------------------");
//
// });
/*
// iOS 10以后用下面的 解決了優(yōu)先級反轉(zhuǎn)問題
// os_unfair_lock_t unfairLock = &(OS_UNFAIR_LOCK_INIT);
// os_unfair_lock_lock(unfairLock);
// os_unfair_lock_unlock(unfairLock);
*/
os_unfair_lock_t unfairLock = &(OS_UNFAIR_LOCK_INIT);
NSLog(@"線程1 準備上鎖");
os_unfair_lock_lock(unfairLock);
sleep(4);
NSLog(@"線程1");
os_unfair_lock_unlock(unfairLock);
NSLog(@"線程1 解鎖成功");
NSLog(@"---------------------------------------");
}
YYKit 作者 @ibireme 的文章也有說這個自旋鎖存在優(yōu)先級反轉(zhuǎn)問題,具體文章可以戳 不再安全的 OSSpinLock掩驱。