美文网首页
多线程 - 线程锁(互斥锁、信号量、自旋锁)

多线程 - 线程锁(互斥锁、信号量、自旋锁)

作者: Th丶小伟 | 来源:发表于2021-02-28 17:36 被阅读0次

互斥锁

互斥锁:被持有的状态下,其他资源申请者只能进入休眠状态,当锁被释放后,CPU会唤醒资源申请者,然后获得锁并访问资源

NSLock

常用方法:lock加锁 unlock解锁。

- (BOOL)tryLock; 尝试加锁  不可用时(被锁了),会返回NO,不会阻塞线程

- (BOOL)lockBeforeDate:(NSDate *)limit; 在所指定Date之前尝试加锁,如果在指定时间之前不能加锁则返回NO。

self.lock = [NSLock new];
[self.lock lock]; 
[self.lock unlock];

synchronized

@synchronized块会隐式的添加一个异常处理例程来保护代码,该处理例程会在异常抛出的时候自动的释放互斥锁

比较耗费性能。不是线程安全。

for循环一下代码 1000次
会崩溃。不同线程获取的对象不同
@synchronized (_testArray) {
    if (_testArray.count == 0) {
        NSMutableArray *array = [NSMutableArray array];
        _testArray = array;
    }
}

GCD - 信号量

定义:用来控制访问资源的数量标识,控制访问的数量。线程的调度

信号量为0则等待 任务执行完毕则加一。执行一个任务则减一

//创建信号量,参数:信号量的初值,如果小于0则会返回NULL
dispatch_semaphore_create(信号量值)
 
//等待降低信号量
dispatch_semaphore_wait(信号量,等待时间)
 
//提高信号量
dispatch_semaphore_signal(信号量)

dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
    //线程1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    NSLog(@"线程1开始");
    sleep(5);
    NSLog(@"线程1结束");
    dispatch_semaphore_signal(semaphore);
});
//线程2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    NSLog(@"线程2开始");
    sleep(5);
    NSLog(@"线程2结束");
    dispatch_semaphore_signal(semaphore);
});

自旋锁

定义:线程反复检查锁变量是否可用,忙等状态(忙碌等待)。
OSSpinLock不在是线程安全。有潜在的优先级反转,使用os_unfair_lock

#import <os/lock.h>
@property (nonatomic, assign) os_unfair_lock unfair_lock;

self.unfair_lock = OS_UNFAIR_LOCK_INIT;//创建自旋锁
os_unfair_lock_lock(&_unfair_lock);//加锁
os_unfair_lock_unlock(&_unfair_lock);//解锁

相关文章

  • 线程同步与互斥

    Linux--线程编程 多线程编程-互斥锁 线程同步与互斥 互斥锁 信号量 条件变量 互斥锁 互斥锁的基本使用...

  • iOS底层探索-多线程锁

    多线程的锁大致可分为两大类:互斥锁、自旋锁;也可以分为三类:互斥锁、自旋锁、读写锁。 一、互斥锁:互斥+同步(强调...

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

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

  • iOS 多线程面试题(自旋锁与互斥锁)

    自旋锁与互斥锁 自旋锁: 是一种用于保护多线程共享资源的锁,与一般互斥锁(mutex)不同之处在于当自旋锁尝试获取...

  • iOS锁

    锁的作用:保证线程安全。锁的分类:互斥锁,自旋锁,其它比如条件锁,递归锁,信号量都是上层的封装和实现。 互斥锁 防...

  • iOS中的自旋锁与互斥锁

    一:自旋锁与互斥锁 自旋锁:是一种用于保护多线程共享资源的锁,与一般互斥锁(mutex)不同之处在于当自旋锁尝试获...

  • 多线程

    同步锁,又叫互斥锁,@synchronized(self) 自旋锁:atomic:原子属性,多线程环境下,只有一个...

  • Linux内核设计与实现——内核同步方法

    主要内容 原子操作 自旋锁 读写自旋锁 信号量 读写信号量 互斥锁 完成变量 大内核锁 顺序锁 禁止抢占 顺序和屏...

  • 并发编程-线程

    线程 GIL 守护线程 线程锁(互斥锁 and 递归锁) 信号量 事件 条件 定时器 1.线程: 特点在多线程的操...

  • iOS中各种锁的性能对比

    自旋锁 与 互斥锁 自旋锁 (spin lock): 如果一个线程需要获取自旋锁,该锁已经被其他线程占用,该线程不...

网友评论

      本文标题:多线程 - 线程锁(互斥锁、信号量、自旋锁)

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