1. 什么是多线程?
多线程指一个进程有多个线程正在执行.
2. 提供了哪些多线程技术方案?
1. GCD
2. NSOperation
3. NSThread
4. 多线程与锁.
3. GCD:
1. 同步/异步,串行/并发?
2. dispatch_barrier_async
3. patch_group.
同步/异步,串行/并发?
此处涉及两个概念,一个是队列,一个是线程.队列,队列特性:先进先出.主队列,全局队列(main_queue分配到主线程中处理和执行的任务,默认代码都是在主队列中执行),并发队列,串行队列.线程分为主线程和其他线程.
1. 同步串行:dispatch_sync(serial_queue,^{//任务});
2. 异步串行:dispatch_async(serial_queue,^{//任务});
3. 同步并发:dispatch_sync(concurrent_queue,^{//任务});
4. 异步并发:dispatch_async(concurrent_queue,^{//任务});
同步:只要是以同步方式提交,不论是串行和是并发都是在当前线程去执行.
异步提交:在其他线程提交.
并发队列:提交到并发队列的所有任务都可以并发去执行.并发执行的意思是,一个任务在执行中,另外的任务加进来也能继续一起执行.
串行队列:先进先出.
performSelector例子:GCD子线程执行处理,默认情况下是没有开启子线程提交到runloop的.
dispatch_barrier_async():异步栅栏调用.形象理解读写分离
思考:怎么利用GCD来实现多读单写.
1. 解决读者和读者可以并发访问读取数据.
2. 读者和写者互斥.
3. 写者和写者互斥.
创建并发队列.
并发队列读取:dispatch_sync(concurrent_queue,^{//读取操作});
并发队列写入:dispatch_barrier_async(concurrent_queue,^{//写入操作});
dispatch_group_async():
思考:使用GCD实现:A,B,C三个任务并发执行,完成后执行任务D.
1. 创建并发队列
2. 创建group
3. dispatch_group_async(group,concurrent_queue,^{//多个任务执行});第一个并发异步执行,指定多个任务在同一个group内.
4. dispatch_group_notify(group,dispatch_get_main_queue,^{//组队列中所有任务异步执行完成才会调用执行});
4.NSOperation
需要和NSOperationQueue配合使用来实现多线程方案.
特点:1. 添加任务依赖.
2. 任务执行状态的控制.
3. 控制最大并发量.MaxCount
- isReady:当前任务是否处于就绪状态
- isExecuting:当前任务是否处于执行状态
- isFinished:当前任务是否已完成
- isCancelled:当前任务是否已取消.
状态控制:
如果只重写main方法,底层控制变更任务执行完成状态,以及任务退出
如果重写start方法,自行控制任务状态.
系统是怎样移除一个isFinished=YES的NSOperation的呢?通过源码发现是通过KVO监听.
5.NSThread.
启动流程:通过源码分析,调用start()->创建pthread->main()->[target performSelector:selector]在这里可以维护一个RunLoop实现常驻线程->exit().
6. 锁:
iOS当中都有哪些锁?
1. @synchronized单例对象中使用
2. atomic原子性.不负责使用.能保证赋值安全,不保证使用安全.可变数组指针指向保证安全,但是进行addobject不能保证线程安全.
3. OSSpinLock:自旋锁,循环等待访问,不释放当前资源.轻量数据访问,内存管理.引用计数+1,-1操作.
4. NSLock:普通锁,互斥事件线程同步中使用.
5. NSRecursiveLock递归锁.
6. dispatch_semaphore_t:信号量是一种锁.
1. dispatch_semaphore_creat():创建semaphore结构体
2. dispatch_semaphore_wait():阻塞是主动行为
3. dispatch_semaphore_singal():如果当前线程没有获取到信号量会继续阻塞,唤醒是被动行为,由释放信号的线程来唤醒被阻塞的线程n
网友评论