iOS多线程---死锁相关

基础知识:

iOS多线程---死锁相关_第1张图片

下面是五道面试题,写出打印结果(题目从别人那盗的,但是作者写的看不明白,用自己语言总结一下)

第一题:

NSLog(@"1"); // 任务1

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"2"); // 任务2

});

NSLog(@"3"); // 任务3

分析:

a.任务2 和 任务3 谁先加入 主线程的?

==> 因为 任务3 本身是在主线程里面的,任务2通过dispatch_get_main_queue(),添加到主线程的,所以就是3在前,任务2在后

b.主线程是串行的,也就是先执行3,后执行任务2

c.但是dispatch_sync,就会让进入等待状态,也就是任务3无法现在执行,只有等着任务2执行完后,才执行,

步骤b,c 就相互等待,进入死锁了。

答案:1

第二题:

NSLog(@"1"); // 任务1

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

NSLog(@"2"); // 任务2

});

NSLog(@"3"); // 任务3

});

分析:任务3,没有加入dispatch_get_global_queue,前面有dispatch_sync,就等着任务2执行。

答案:123

第三题:

dispatch_queue_t queue = dispatch_queue_create("com.demo.serialQueue", DISPATCH_QUEUE_SERIAL);​

NSLog(@"1"); // 任务1​

dispatch_async(queue,^{​

       NSLog(@"2");// 任务2​

       dispatch_sync(queue, ^{​

               NSLog(@"3"); // 任务3

       ​});​

       NSLog(@"4"); // 任务4​

});​

NSLog(@"5"); // 任务5

分析: 任务5,不在dispatch_queue_create里面,前面是dispatch_async,可能5先执行,也可能任务2先执行。现在4已经在dispatch_queue_create里面了,但是前面又有dispatch_sync,等着3,3也需要加入dispatch_queue_create,3在4后面,和第一题一样,相互等待,死锁

答案:1 5 2  或 125

第四题:

NSLog(@"1"); // 任务1

​dispatch_async(dispatch_get_global_queue(0, 0), ^{

​        NSLog(@"2"); // 任务2​

        dispatch_sync(dispatch_get_main_queue(), ^{​

         NSLog(@"3"); // 任务3

       ​});

        ​NSLog(@"4"); // 任务4

​});​

NSLog(@"5"); // 任务5

分析:任务2 和 任务5并行,不确定那个先后,但是肯定在 3,4 之前

答案:15234 或者12534

第五题:

dispatch_async(dispatch_get_global_queue(0, 0), ^{

        ​NSLog(@"1"); // 任务1

​      dispatch_sync(dispatch_get_main_queue(), ^{​

             NSLog(@"2"); // 任务2​

        });​

       NSLog(@"3"); // 任务3

​});​

NSLog(@"4"); // 任务4​

while (1) {​}​

NSLog(@"5"); // 任务5

分析:任务1和任务4不一定那个先(两者并行),然后主线程死循环,主线程被阻塞,任务3加入全局队列,任务3前面有dispatch_sync,等着任务2 ,任务2加入了主线程,这时主线程已经死循环了,干不了事情,任务2挂了,任务3 也挂了,任务5早就挂了。

你可能感兴趣的:(iOS多线程---死锁相关)