线程间通讯:
PerformSelector (选择器模式)
NSMachPort/CFMatchPort
GCD的方式
多线程:
方案 | 简介 | 语言 | 线程生命周期管理 | 使用频率 |
ptheard | 一套通用的多线程api,适用于Unix/Linux/windows等系统, 跨平台可移植, 使用难度大 | C语言 | 程序员管理 | 几乎不用 |
NSTheard | 使用更加面向对象,简单易用,可以直接操作对象 | OC语言 | 程序员管理 | 偶尔使用 |
GCD | 旨在替代NSTheard等多线程技术,充分利用设备的多核 | C语言 | 自动管理 | 经常使用 |
NSOperation | 基于GCD,比GCD多了一些简单实用的功能,更加面向对象 | OC语言 | 自动管理 | 经常使用 |
1.pthreads: 基于C语言的一套多线程框架,在很多操作系统都适用
2.NSTheard:苹果封装的,完全面对对象的。可以用来直接操作线程对象,方便直观,但是要自己管理线程的生命周期。
如:[NSTheard MainTheard], [NSTheard currentTheard]
3.GCD: 线程生命周期自动管理
使用步骤:
1.创建一个串行或者并行队列
2.将任务加入到队列中执行
任务
| 是否等待 | 是否开启新线程 |
同步执行(sync) | 会一直等待,直到队列里任务完成才继续执行 | 只在当前线程执行任务,不会开辟新线程 |
异步执行(async) | 不会等待,可以继续执行任务 | 可以在新的线程执行任务,具备开辟新线程的功能 |
队列
| 执行顺序 | 开启线程数 |
串行队列 | 只开启一个线程,一个执行完才执行另一个 | 只有一个线程 |
并行队列 | 多任务同时执行 | 可以开启多个线程,同时执行任务 |
区别 | 并行队列 | 串行队列 | 主队列 |
同步 | 没有开辟新线程,排队执行 | 没有开辟新线程,顺序执行任务 | 死锁,卡主主线程 |
异步 | 开辟新线程,并发执行任务 | 开辟一条新线程,串行执行任务 | 不开新线程,串行执行任务 |
dispatch_barrier_async :栅栏方法
dispatch_after:延时执行方法
dispatch_once: 只执行一次方法
dispatch_apply:快速迭代方法
dispatch_group:GCD队列组
dispatch_group_notify: 监听任务的完成状态
dispatch_group_wait:暂停当前线程(阻塞当前线程),等待指定的 group 中的任务执行完成后,才会往下继续执行
dispatch_group_enter:任务加入队列
dispatch_group_leave: 任务离开队列
4. NSOperation: 底层是GCD,基于GDC的。比GCD多了一些简单实用的功能,更加面向对象,线程生命周期自动管理
线程安全问题的解决方法:
1.互斥锁(同步锁) sleep-wating类型的锁,加锁使线程休眠,直到被锁资源释放,才会唤醒休眠的线程
2.自旋锁 busy-wating类型的锁,会一直循环,直到被锁资源释放为止