美文网首页
iOS多线程

iOS多线程

作者: 路有点颠簸 | 来源:发表于2021-03-09 10:17 被阅读0次

GCD基础使用
多线程直通车
死锁
信号量

-串行/并行

串行(Serial Queue):同一时间内,队列中只能执行一个任务,只有当前的任务执行完成之后,才能执行下一个任务 - DISPATCH_QUEUE_SERIAL
并行(concurrent Queue):同时允许多个任务执行(并行队列中才会有多个线程,串行的只有一个线程) - DISPATCH_QUEUE_CONCURREN

-同步/异步

同步(Sync):等到当前的任务执行完成,线程才会继续去执行下面的任务
异步(Async):线程会立即返回,无需等待就会继续直线下面的任务

-区别

串行并行:决定任务执行方式是串行还是并行(也就是说开启多少条新线程)
同步异步:决定是否开启新线程(也就是是否具有开启新线程的能力)

大量创建串行队列:相当于修了多条单车道公路
并行队列随意创建:由系统内核高效管理,不影响系统性能

-死锁

两个或以上的线程互相等待彼此执行,通常情况有(在同一个串行队列中执行同步操作,或两个线程互相依赖等情况)

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSLog(@"0----%@",[NSThread currentThread]);
    //创建一个串行队列
    dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);
    //异步执行串行队列
    dispatch_async(queue, ^{//block1开始
        NSLog(@"1----%@",[NSThread currentThread]);
        
        dispatch_async(queue, ^{//block2开始
            NSLog(@"2----%@",[NSThread currentThread]);
        });
        
        NSLog(@"3----%@",[NSThread currentThread]);
        ///注意此处是sync,不是async
        dispatch_sync(queue, ^{//block3开始
            NSLog(@"4----%@",[NSThread currentThread]);
        });
        NSLog(@"5----%@",[NSThread currentThread]);
    });//block1结束
    NSLog(@"6----%@",[NSThread currentThread]);  
}

打印:

2020-06-10 11:31:48.139871+0800 LHMVVMDemo[6784:328072] 0----<NSThread: 0x600000fb4a00>{number = 1, name = main}
2020-06-10 11:31:48.140076+0800 LHMVVMDemo[6784:328072] 6----<NSThread: 0x600000fb4a00>{number = 1, name = main}
2020-06-10 11:31:48.140098+0800 LHMVVMDemo[6784:329122] 1----<NSThread: 0x600000fece40>{number = 5, name = (null)}
2020-06-10 11:31:48.140222+0800 LHMVVMDemo[6784:329122] 3----<NSThread: 0x600000fece40>{number = 5, name = (null)}

程序崩溃在dispatch_sync(queue, ^{//block3开始 这一行
分析:
-直接到block2,检测到block2是async,函数不等block2执行完,继续向下执行,打印nslog 3---
-(关键)到block3,检测sync,是同步,没有新开线程,并且在queue这个队列中,只能和block1共用一个线程,block1的线程还在处理block1,block3没人处理,造成死锁
block2为什么不打印:
block2新开了线程,有线程处理block2啊,但是这要看队列,这是一个串行队列,三个任务要顺序执行,然而,然而,block1还没执行完,所以block2自然就不会打印,还在排队中

  • 如果block3改成异步则正常输出 0613524

-阻塞

只要是同步操作都会阻塞一个线程

-所以

1.在遇到需要多线程相互依赖的情况,一定要注意,不要两个线程互相依赖,这样会造成死锁
2.在使用同步线程时,要注意不要在同一个串行队列中使用,还要注意线程阻塞问题

相关文章

网友评论

      本文标题:iOS多线程

      本文链接:https://www.haomeiwen.com/subject/zmbvohtx.html