多线程问题-死锁

有问题

- (void)textDemo2{
    // 同步队列
    dispatch_queue_t queue = dispatch_queue_create("cooci", DISPATCH_QUEUE_SERIAL);
    NSLog(@"1");
    // 异步函数
    dispatch_async(queue, ^{//dispatch_async(必须等待当前语句执行完毕,才会执行下一条语句)或dispatch_sync(必须等待当前语句执行完毕,才会执行下一条语句) 只会影响 NSLog(@"5") 的 执行
        NSLog(@"2");//任务1
        
        // 同步
        dispatch_sync(queue, ^{
            NSLog(@"3");//任务3
        });
        
        //NSLog(@"4");//任务2
        for (int i=0; i<100; i++) {
            NSLog(@"4");
        }
    
        //只有 队列 和 任务,不需要考虑线程了
        //dispatch_sync 必须等待当前语句执行完毕,才会执行下一条语句 所以任务3在任务2之前执行
        //串行队列 : FIFO: 先进先出 由于任务2先放入串行队列,任务3是block块是后放入串行队列的,所以任务2在任务3之前执行
        //所以相互抢,所以死锁。
        
        //dispatch_sync 换成 dispatch_async 打印是2、4都打印完、3,还是因为100个任务4先进入串行队列,所以先执行。
    });
    NSLog(@"5");
    //1、2、3、4、5
}

完美解释

- (void)textDemo3{
    dispatch_queue_t queue = dispatch_queue_create("cooci", DISPATCH_QUEUE_SERIAL);
    NSLog(@"1");
    //一个block(^{}),相当于一个任务
    // 异步函数
    dispatch_async(queue, ^{
        //任务1
        dispatch_sync(queue, ^{//任务2
            NSLog(@"3");
        });
        //只有 队列 和 任务,不需要考虑线程了
        //dispatch_sync 必须等待当前语句执行完毕,才会执行下一条语句 所以任务2在任务1之前执行
        //串行队列 : FIFO: 先进先出 由于任务1先放入串行队列,任务2是block块是后放入串行队列的,所以任务1在任务2之前执行
        //所以相互抢,所以死锁。
        //并行队列 : 不会死锁
    });
    NSLog(@"5");
}

主队列同步任务-死锁

    dispatch_sync(dispatch_get_main_queue(), ^{

    });

你可能感兴趣的:(多线程问题-死锁)