自旋鎖是專為防止多處理器并發而引入的一種鎖,它在內核中大量應用于中斷處理等部分(對于單處理器來說,防止中斷處理中的并發可簡單采用關閉中斷的方式,即在標志寄存器中關閉/打開中斷標志位,不需要自旋鎖)。
自旋鎖,和互斥鎖類似,都是為了保證線程安全的鎖。但二者的區別是不一樣的,對于互斥鎖,當一個線程獲得這個鎖之后,其他想要獲得此鎖的線程將會被阻塞,直到該鎖被釋放。但自旋鎖不一樣,當一個線程獲得鎖之后,其他線程將會一直循環在哪里查看是否該鎖被釋放。所以,此鎖比較適用于鎖的持有者保存時間較短的情況下。
部分代碼如下:
以下代碼要導入以下頭文件
#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以后用下面的 解決了優先級反轉問題
// 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 的文章也有說這個自旋鎖存在優先級反轉問題,具體文章可以戳 不再安全的 OSSpinLock。