iOS自旋锁

作者: ptlCoder | 来源:发表于2017-10-24 10:47 被阅读42次

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

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

部分代码如下:

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

#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

相关文章

  • iOS面试题与核心基础之线程同步(锁,串行队列,信号量,@syn

    锁 iOS多线程锁有两类 自旋锁 和 互斥锁自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。资源已...

  • 锁 iOS中锁只分为两大类: 自旋锁(spin) :自旋锁其实是while轮询,避免了进程上下文的调度开销,因此对...

  • iOS 不安全的OSSpinLock锁

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

  • iOS自旋锁

    自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的...

  • iOS中使用到的加锁方案

    前言 iOS中使用到的锁有哪些? OSSpinLock自旋锁 os_unfair_lock互斥锁 pthread_...

  • iOS 开发中加锁

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

  • 关于自旋锁

    自旋锁是什么? spinlock,不断的自旋(自我循环)尝试获得锁。参考文档:Java中的自旋锁 自旋锁的实现 自...

  • 自旋锁与互斥锁

    自旋锁(Spin lock) 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保...

  • iOS 多线程,自旋锁和互斥锁详解

    iOS 多线程,自旋锁和互斥锁详解[https://www.jianshu.com/p/a49739c41bac]...

  • iOS 多线程之GCD

    iOS 多线程,自旋锁和互斥锁详解[https://www.jianshu.com/p/a49739c41bac]...

网友评论

    本文标题:iOS自旋锁

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