GCD的一些应用知识点
来源:互联网 发布:淘宝买家id是什么 编辑:程序博客网 时间:2024/06/06 12:22
本篇各种零散的点,是自己在看杰哥教学视频时整理的知识点。
GCD队列
- 主队列
- 串行队列
- 并行队列
- FIFO
线程安全
在串行队列里dispatch_sync会直接crash (DISPATCH_CLIENT_CRASH)。因为在代码走到这里直接就进入crash,而不会再往下走,进入wait了。
内部临界区: 只能有一个线程或是特定的线程执行的一段代码。
外部临界区:
业务代码不能被两个或多个线程同时执行。(串行队列)
优先级适用不恰当造成:
- ###### 竞态条件:
两个或多个线程读写某些共享数据,而最后的结果取决于线程运行的精确时序。 - ###### 优先级反转:
优先级高的在等待优先级低的先完成,在等待的同时,另一个优先级低的线程不用等待,就跑在了优先级高的线程前面,造成优先级反转。所以,几乎总是使用默认优先级队列。
dispatch source
是一个监听某些类型事件的对象,当这些事件发生时,它自动将一个Block放入一个dispatch queue的执行过程中。
source_t time 与 NSTimer 的区别
NSTimer是持有传入的target,用完之后忘记释放的话,会造成内存泄漏。而且是跟runloop相关,有时候会容易触发在不同的runloop会出现不同情况。(NSDefaultRunLoop不会计时)
source_t 就没有那么多问题,比较好用。
隐藏的API
-dispatch_queue_set_width
设置队列宽度,1 为串行;>1 为并行。(系统创建串,并行队列时也是这么创建的)
-dispatch_benchmark
统计代码的执行效率
-dispatch_block_cancel
可以取消一个block
class initialization
- 运行时会在类对象收到其他消息之前调用initialize。
- 多线程情况下,保证initialize在收到第一条消息的那个线程调用。
- 多线程情况下,如果initialize执行过程中,其他线程给这个类发送消息,会block直到这个initialize调用完成。
AutoreleasePool
- 每个线程都保持自己的pool对象
- 主线程的pool对象会自动创建和销毁
RunLoop
- 每个线程只有一个runloop
- 每个runloop有自己的input modes,之间互不干扰
- 主线程runloop自己运行,子线程手动
- 调用NSRunLoop方法是线程不安全的,需要在runloop所以在的线程调用。
====
- 是线程的一个基础设施,不能脱离线程存在
- 管理事件/source/timer source
- 没有处理消息时休眠以避免资源占用
- 有消息到来时立刻被唤醒
线程同步
- 加锁
- 原子操作
- synchronize
。。。
SpinLock
线程通过busy-wait-loop的方式来获取锁,任时刻只有一个线程能够获得锁,其他线程忙等待直到获得锁
问题:产生优先级反转原则:1、临界区简单,非耗时操作 2、线程同一优先级
@synchronized
- 只有传同样的对象给synchronized,才能起到加锁作用
- 如果传nil,是 法起到加锁作用的
- 可以重入
- synchronized不会持有传给它的对象
- 你在synchronized里面销毁了这个对象,不会有问题
- synchronized内部有异常处理,所以不用担心异常产生的时候不会unlcok。
Runloop Source
source 0: 非基于port,用于用户主动触发事件 只包含一个回调,并不能主动触发事件,需要先调用 CFRunLoopSourceSignal(source),然后手动调用CFRunLoopWeakUp(runloop)唤醒runloop,让其处理。 source 1: 基于port,用于内核与线程之间通信,包含一个mach_port和一个回调,被用于通过一个内核和其他线程互发消息,可以主动唤醒runloop。
两个APP之间通信
1. URL
2. 剪切板
3. keychain
4. 服务器中转
5. source
- GCD的一些应用知识点
- GCD的一些小应用
- GCD的一些小应用(多线程)
- 提高android应用效率的一些知识点
- GCD的应用 及线程的一些概念
- IOS开发(50)之GCD的一些小应用
- IOS开发(50)之GCD的一些小应用
- GCD的一些东西
- GCD的一些用法
- GCD的一些原理
- GCD的一些功能
- gcd的一些性质
- GCD的一些知识
- GCD的应用
- GCD常用的应用
- GCD 线程的应用
- GCD线程的应用
- 傅里叶变换在图像处理中的应用:一些零散的知识点
- php+redis+lua+id生成器,分布式id生成器
- 腾讯云CentOS7构建服务器(jdk1.8,tomcat8,nginx1.8.1)
- directadmin安装
- aterisk monitor 指定录音阶段是否录回铃音
- mysql局域网配置
- GCD的一些应用知识点
- cmd 运行jar
- 数组
- 另类的java.lang.OutOfMemoryError
- QtQml应用程序的性能考虑与建议
- gitlab ci docker模式初探
- 杭电2086数学题
- 【Android】强大的SpannableStringBuilder
- linux命令(应急用)