iOS自旋锁

自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,即在标志寄存器中关闭/打开中断标志位,不需要自旋锁)。

自旋锁,和互斥锁类似,都是为了保证线程安全的锁。但二者的区别是不一样的,对于互斥锁,当一个线程获得这个锁之后,其他想要获得此锁的线程将会被阻塞,直到该锁被释放。但自旋锁不一样,当一个线程获得锁之后,其他线程将会一直循环在哪里查看是否该锁被释放。所以,此锁比较适用于锁的持有者保存时间较短的情况下。

部分代码如下:

以下代码要导入以下头文件

#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

github: https://github.com/soliloquy-local/OSSpinLock.git

推荐阅读更多精彩内容