美文网首页
iOS 锁的使用

iOS 锁的使用

作者: yxibng | 来源:发表于2018-12-23 22:23 被阅读0次

参考 demo

参考的文章:
iOS开发中的11种锁以及性能对比
多线程-线程安全

结论:

  • 自旋锁性能 > 信号量 > 互斥锁
  • 等待互斥锁的线程会进行休眠状态避免继续占用CPU资源
  • 互斥的实现涉及到了可能发生的内核态切换,线程休眠、唤醒等,如果临界执行代码足够小而快,不适合互斥锁
  • 等待自旋锁的线程会进入while循环中空转等待
  • 自旋的实现逻辑足够简单,只要标记位的修改被设计为原子操作,就能保证多线程环境下的安全。对比互斥方案,自旋没有线程切换、休眠唤醒的开销。但是空转的代码会导致CPU在等待期间是满负荷执行的,如果加锁的代码不够小而快,甚至会直接影响到程序的运行

互斥锁

  1. NSLock
//初始化
self.array = @[].mutableCopy;
self.lock = [[NSLock alloc] init];
self.lock.name = @"com.example.lock.nslock";

//多线程,访问临界区
[self.lock lock];
[self.array addObject:number];
[self.lock unlock];

  1. pthread_mutex_t
//头文件
#import <pthread.h>

//定义
pthread_mutex_t mutex;

//初始化
self.array = @[].mutableCopy;
pthread_mutex_init(&mutex,NULL);

//多线程,访问临界区
pthread_mutex_lock(&mutex);
[self.array addObject:number];
pthread_mutex_unlock(&mutex);

//dealloc
pthread_mutex_destroy(&mutex);

  1. @synchronized
@synchronized (self) {
    [self.array addObject:number];
}

自旋锁

  1. OSSpinLock (废弃)

存在的问题,优先级反转:

如果一个低优先级的线程获得锁并访问共享资源,这时一个高优先级的线程也尝试获得这个锁,它会处于 spin lock 的忙等状态从而占用大量 CPU。此时低优先级线程无法与高优先级线程争夺 CPU 时间,从而导致任务迟迟完不成、无法释放 lock

#import <libkern/OSAtomic.h>

OSSpinLock lock = OS_SPINLOCK_INIT;
OSSpinLockLock(&lock);
//临界区代码
OSSpinLockUnlock(&lock);
  1. os_unfair_lock(OSSpinLock的替代方案,iOS10.0以后可用)
#import <os/lock.h>

os_unfair_lock_t unfairLock;
unfairLock = &(OS_UNFAIR_LOCK_INIT);
os_unfair_lock_lock(unfairLock);
//临界区代码
os_unfair_lock_unlock(unfairLock);

信号量

dispatch_semaphore_create(long value); // 创建信号量
dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout); // 等待信号量
//临界区的代码
dispatch_semaphore_signal(dispatch_semaphore_t deem); // 发送信号量

使用barrier

dispatch_queue_t queue = dispatch_queue_create("queue.concurrent", DISPATCH_QUEUE_CONCURRENT);

__block int value = 1;

dispatch_async(queue, ^{
    NSLog(@"task1,value = %d",value);
});

dispatch_async(queue, ^{
    NSLog(@"task2, value = %d",value);
});

dispatch_barrier_async(queue, ^{
    value = 2;
    NSLog(@"barrier, modify value to %d", value);
});

dispatch_async(queue, ^{
    NSLog(@"task3, value = %d",value);
});

相关文章

  • OC--各种线程锁

    参考:正确使用多线程同步锁@synchronized()iOS中的锁iOS多线程安全详解iOS 常见知识点(三):...

  • iOS-锁-@synchronized

    @synchronized,同步锁,又名对象锁,由于其使用简单,基本上是在iOS开发中使用最频繁的锁。 使用方式如...

  • iOS中使用到的加锁方案

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

  • iOS 锁的使用

    参考 demo 参考的文章:iOS开发中的11种锁以及性能对比多线程-线程安全 结论: 自旋锁性能 > 信号量 >...

  • iOS 锁的使用

    简介 自旋锁:在访问被锁资源时,调用者线程不会休眠,而是不停循环在那里,直到被锁资源释放锁。互斥锁:在访问被锁资源...

  • iOS锁系列-目录

    1、 iOS锁系列-NSLock对象锁2、iOS锁系列-NSConditionLock条件锁3、iOS锁系列-NS...

  • 谈下Objective C都有哪些锁机制,你一般用哪个?

    原文:iOS面试题大全 1)NSLock iOS中对于资源抢占的问题可以使用同步锁NSLock来解决,使用时把需要...

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

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

  • iOS锁的基本使用

    @synchronized dispatch_semaphore dispatch_semaphore_wait ...

  • iOS 线程锁的使用

    一、线程锁相关概念 线程锁:我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全...

网友评论

      本文标题:iOS 锁的使用

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