博客
关于我
互斥锁--NSLock
阅读量:584 次
发布时间:2019-03-11

本文共 1238 字,大约阅读时间需要 4 分钟。

互斥锁在多线程编程中扮演着至关重要的角色,用于保护对临界资源的访问,防止多个线程同时读写同一资源。在iOS开发中,最常用的互斥锁工具包括NSLock、@synchronized、pthread_mutex、NSCondition等。以下我们将重点分析NSLock。

NSLock 简介

NSLock是Objective-C中最基础的锁机制之一,继承自NSObject并遵循NSLocking协议。它的核心功能是阻止多个线程同时访问共享资源。在获取锁时,如果目标锁已被占据,当前线程会被系统挂起,直到占据锁的线程释放资源。

从NSLock的API来看,其实现非常简单:

- (void)lock;- (void)unlock;- (BOOL)tryLock;- (BOOL)lockBeforeDate:(NSDate *)limit;

tryLocklockBeforeDate 方法尤为重要,其中后者通过自旋锁机制,配合时间限制,避免线程等待过久。

NSLock 的注意事项

在使用NSLock时需注意以下几点:

  • 非递归锁特点:NSLock属于非递归锁。多个线程从同一线程获取同一锁时,会导致死锁。本例中的错误代码展示了这种情况:
  • - (void)methodA {    self.lock = [[NSLock alloc] init];    [self.lock lock]; // 1    [self methodB];  // 2    [self.lock unlock]; // 3}- (void)test {    [self.lock lock]; // 3 线程导致死锁    [self.lock unlock]; // 无法执行}
    1. 线程安全:不同线程对同一锁的使用必须严格遵守互斥原则。如果出现违反这种原则的情况,可能导致死锁或数据不一致。
    2. NSLock 的实现细节

      NSLock的底层是基于pthread_mutex实现的,提供了一层封装。具体实现细节包括:

    3. 初始化init方法初始化一个PTHREAD_MUTEX_ERRORCHECK类型的互斥锁。这种类型的锁在加锁失败时会触发错误处理。

    4. 加锁机制lockBeforeDate方法使用pthread_mutex_trylock循环检查是否能在指定时间内获得锁。如果成功,返回YES;如发生死锁(EDEADLK)则触发错误处理,并让出资源。

    5. 错误处理机制

      NSLock内置了错误检测机制。例如,在线程尝试获取已被占据的锁时,会调用用户指定的错误处理函数,提示开发者防止死锁。

      总结

      通过对NSLock的分析可以看出它作为iOS平台的首选互斥锁工具,功能简单而实用。尽管它可能比如>@synchronized或者NSRecursiveLock更基础,但在大多数场景中都是最优解。对于需要更高级互斥控制的场景,可以考虑使用NSConditionLock或NSRecursiveLock。

    转载地址:http://clttz.baihongyu.com/

    你可能感兴趣的文章
    算法训练 完数(循环,数学知识)
    查看>>
    什么是接口
    查看>>
    2020版nodejs12.18.3安装配置教程
    查看>>
    iview组件库中,Form组件里的Input,无法正确绑定on-enter事件
    查看>>
    记录-基于springboot+vue.js实现的超大文件分片极速上传及流式下载
    查看>>
    JavaScript高级程序设计第四版学习记录-第九章代理与反射
    查看>>
    怎么解决Windows 10文件/文件夹正在使用无法删除
    查看>>
    matlab函数:fix 向0取整
    查看>>
    ORCAD创建元件库时,格点对不起怎么办
    查看>>
    Allegro中如何消除器件本身Pin间距报错
    查看>>
    AD中拖动器件,无法移动在一起如何解决
    查看>>
    linux--练习001-基础类型
    查看>>
    Flask--简介
    查看>>
    Flask模板--过滤器与测试器
    查看>>
    16 python基础-恺撒密码
    查看>>
    06.1 python基础--结构控制
    查看>>
    Frame--Api框架
    查看>>
    Frame--WEB框架
    查看>>
    idea 在Debug 模式中运行语句中函数的方法
    查看>>
    eclipse“SVN检出”遇到问题 error getting dir list 的解决办法
    查看>>