进程:应用层面
线程:上下文层面
GCD: 队列异同组>业务场景
具体表现:具体的Queue队列的调度命令码
当前(时刻点) 应用程序的活动状态
应用程序在当前的活动状态下存在多少个线程(条)
同步概念:最多存在1个线程(不支持线程间(动态)切换)
异步概念: 支持在多个线程间动态切换 (1+1)(1+N)
串行/并行概念:强调(层关系/行维度) 线程条的数量(任意个线程条 取决于所在的场景)
调度命令码本身内的块实例(正常情况默认开启)新上下文环境 具体是否开启取决于所在的场景
线程可着重强调内部自有的串特性也可着重强调彼此间的并特性
线程(条)(元地址) : 执行的抽象表现
线程(条) 对应着 (1个或多个)任意个不同的上下文环境 取决于所在的场景
1+N (N数(从1开始))
行维度/线程池内分为激活线程/惰性线程(1个激活线程其余为惰性线程)
同一个上下文环境内命令码的地位同级并触发过程由上而下 同上下文环境内先后的顺序大方向不变
长方体盒 线程池 整体对外呈现单维度进程体系
研究存在的线程:
应用程序当前的活动状态下不存在线程情形:
- 0个线程
同步+ (主队列)串行:死锁(直接崩溃/卡住/执行不了)(类似断点暂停)
应用程序当前的活动状态下只存在1个线程情形(调度命令码不开启新上下文环境):
2. 1个线程
异步+(主队列)串行:只存在并激活主main线程(当前main主环境内:上面布置普通命令下面布置调度命令)(命令触发过程:先执行外部上面指令再依次执行下面block事件内调度指令)
- 1个线程
同步+(普通队列)串行 / 同步+全局队列并行/同步+(普通队列)并行: 只存在并激活主main线程(当前main主环境内:由上而下所有命令顺序不变)(命令触发过程:block事件 内外待执行级别相同有序进行即可(逻辑由上而下顺序))
应用程序当前的活动状态下存在2个线程情形(调度命令码开启新上下文环境):
((1+N)个环境)
4. 2 = 1+1个线程
异步+(普通队列)串行:1main线程+1个普通线程(1+1)
应用程序当前的活动状态下存在多个线程情形:
5.异步+(普通队列)并行/ 异步+全局队列并行:1main线程+N个普通线程((1+N)个线程)
//步+行组合(指令元素块block)
- (void)syncTestWithQueue:(dispatch_queue_t)queue withBarrier:(BOOL)barrier {
NSLog(@"1");
dispatch_sync(queue,^{
//((普通队列)串行+同步):block事件自然完成之前(block事件内的所有指令执行完成之前)(block事件所在的整个c函数调用指令执行完成之前cpu不会处理所在的c函数调用指令往后的同级别调用指令)(block事件所在的整个c函数调用指令执行完成之后cpu继续处理所在的c函数调用指令往后的同级别调用指令)(block事件 内外待执行级别相同有序进行即可)
//(主队列)串行+同步:block事件所在的整个c函数指令直接出现阻塞效果(类似断点)(阻塞即暂停在(当前)前方状态下即调用处c函数指令不会触发执行一直中断)(即block事件不会触发且后面的逻辑事件均不触发)
//同步+(普通队列)并行 :只激活原来的默认主main线程签(block事件外部与block事件所在的整个c函数调用指令同级别的其他同等指令的插入待执行级别等于block事件内的所有待执行指令的插入待执行级别)(block事件 内外待执行级别相同有序进行即可)
//同步+全局队列并行:只激活原来的默认主main线程签(block事件外部与block事件所在的整个c函数调用指令同级别的其他同等指令的插入待执行级别等于block事件内的所有待执行指令的插入待执行级别)(block事件 内外待执行级别相同有序进行即可)
//
NSLog(@"start 1");
sleep(3);
NSLog(@"end 1");
NSLog(@"NSThread1=%@",[NSThread currentThread]);
});
NSLog(@"2");
dispatch_sync(queue, ^{
NSLog(@"start 2");
sleep