自旋锁是专为防止多处理器并发而引入的一种锁,它在中大量应用于等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,即在中关闭/打开中断标志位,不需要自旋锁)。
自旋锁,和互斥锁类似,都是为了保证线程安全的锁。但二者的区别是不一样的,对于互斥锁,当一个线程获得这个锁之后,其他想要获得此锁的线程将会被阻塞,直到该锁被释放。但自旋锁不一样,当一个线程获得锁之后,其他线程将会一直循环在哪里查看是否该锁被释放。所以,此锁比较适用于锁的持有者保存时间较短的情况下。
部分代码如下:
以下代码要导入以下头文件
#import#import #import 复制代码
// 自旋锁- (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 的文章也有说这个自旋锁存在优先级反转问题,具体文章可以戳 。
github: https://github.com/soliloquy-local/OSSpinLock.git