首页 > 其他分享 >iOS:线程锁

iOS:线程锁

时间:2023-04-21 13:56:30浏览次数:43  
标签:semaphore iOS dispatch 互斥 线程 自旋 执行

1. 什么是线程锁

线程锁主要是用来控制多个线程同时访问和修改,避免造成不可预期的问题。

2. 自旋锁和互斥锁

自旋锁:
一种用来保护多线程共享资源的锁,与互斥锁不同的是,当自旋锁尝试获取锁是否可用时,以忙等待进行循环检查锁是否可用。当上一个线程没有执行完毕时,下一个线程一直处于忙等待中,不能休眠。(简单理解为,轮询的方式检查锁是否可用。轮不到你时,你就一直等着,不准休息)

互斥锁:
当上一个锁没有执行完毕时,下一个锁会进入休眠状态。当上一个锁执行完毕后,下一个锁会自动唤醒然后执行任务。(简单理解:别人执行任务时,你先休息;别人完成了,你醒了干活)

总结:
自旋锁忙等待,所以不会进入休眠。如果执行不耗时的操作时,执行效率比互斥锁高。同时也是自身的缺点,如果执行耗时的操作,因为下一个线程一直处于忙等多种,所以 CPU 的使用效率就会比较低。

3. 常见的锁
  1. atomic:自旋锁
  2. @synchronized:互斥锁
  3. NSLock:互斥锁
  4. Dispatch_semaphore:自旋锁
  5. NSRecursiveLock:互斥锁
  6. OSSpinLock:互斥锁

注:
dispatch_semaphore_create:给信号量一个初始值,不能低于 0。
dispatch_semaphore_wait:让信号量 -1。如果信号量值等于 0 则开始循环等待。
dispatch_semaphore_single:让信号量+ 1

4. 线程死锁

线程死锁就是队列使用不当引起的线程循环等待。

常见的有

  1. 在主队列中使用同步:dispatch_sycn(dispatch_get_main_queue,^{})
  2. dispatch_semaphore 中没有及时发送信号。

标签:semaphore,iOS,dispatch,互斥,线程,自旋,执行
From: https://www.cnblogs.com/dulinshun/p/ios-xian-cheng-suo.html

相关文章

  • iOS:常用的正则表达式
    转载自Swift正则表达式-简书(jianshu.com)数字:^[0-9]*$n位的数字:^\d{n}$至少n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?......
  • iOS:use_frameworks 的作用
    Swift项目中的Podfile中默认会有一个use_frameworks!,本篇说一下use_frameworks!。1.Pod引入组件的类型iOS使用Pod引入组件,主要引入以下类型的组件。类型1:静态库类型组件。可以为`.a`或`.framework`类型的静态库。类型2:动态库类型组件。可以为`.framework`类......
  • iOS:响应链的原理
    iOS中不是所有的对象都能响应的,只有继承UIResponder的对象才能进行响应处理事件,称之为响应者对象。常见的响应者对象有:UIView,UIViewController,UIApplication响应链的流程:1.当产生某一个触摸事件的时候,这个触摸事件回添加到UIApplication管理的事件队列中。2.UIAppli......
  • iOS:字典存储数据的原理
    注:适用于Java等其他语言的技术原理存储的逻辑1.字典底层有一个数组,靠数组来存储数据;2.将key进行hash算法。得到`hash值`;3.将`hash值`与`数组的长度`进行`位与运算`,得到的结果为数据应该存储的位置;4.找到数组对应的位置,然后设置对应的数据(此处使用链表①进行......
  • iOS:AutoReleasePool
    具体参考文章AutoRelease是依靠AutoreleasePoolPage来进行push和pop进行工作的AutoreleasePoolPage为双向链表,parent字段指向上一层,child指向下一层每个AutoreleasePoolPage的大小为4096字节每个AutoreleasePoolPage最多可以存放505个对象。首个page可以......
  • iOS:runloop 相关
    一个Runloop包含了多个mode一个mode包含了若干个source0/source1/time/observerRunloop启动时只能选择其中一个model作为当前modelRunloop常用的Model1.UIInitializationRunLoopMode:首次启动时执行的mode,启动后不再使用2.kRunloopDefaultMode:默认mode,一般主......
  • BIOS
    配置开发环境,写一个helloworld驱动程序编写基本的驱动程序代码结构,导出为自定义项目模板,方便以后使用模板创建项目,少写一些样板代码;同时了解了wdk的ntifs头文件和预处理指令#pragmaonce  vscode联机搜索文档 开发三件套: 调试器WinDbg(X64)+虚拟机VirtualBox+编译器VSc......
  • iOS:Cocoapods 常用命令
    命令描述安装与卸载sudogeminstallcocoapods安装cocoapodssudogeminstallcocoapods-v1.10.0安装cocoapods1.10.0版本sudogemuninstallcocoapods卸载cocoapodssudogemuninstallcocoapods-v1.10.0卸载版本1.10.0---安装在个......
  • C#多线程学习(三) 生产者和消费者
    C#多线程学习(三)生产者和消费者线程学习第一篇:C#多线程学习(一)多线程的相关概念线程学习第二篇:C#多线程学习(二)如何操纵一个线程前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数......
  • vue全家桶进阶之路47:Vue3 Axios拦截器封装成request文件
    可以将Axios拦截器封装成一个单独的request文件,以便在整个应用程序中重复使用。以下是一个示例,展示如何将Axios拦截器封装成一个request文件:1、创建一个名为request.js的新文件,并导入Axios:importaxiosfrom'axios';2、创建一个名为request的函数,并将其导出:这将创建一个名......