24.任务与队列的几个面试题
一、 我们先看个面试题热热身
面试题一 - 串行队列
下面的打印输出会是什么样?
A: 1230789
B: 1237890
C: 3120789
D: 2137890
分析
3
的同步任务,阻碍了0 7 8 9
的异步任务,故3
一定在0 7 8 9
前。7 8 9
三个任务的顺序不一定,但在0
之后。1 2 3
的顺序不一定。
满足上面几点的答案为:A C
这里很可能会觉得
12
一定在3
之前,要清楚3
阻塞的是3
之后的任务,123
的顺序并不一定。
如果是异步队列呢?
123 789 都是乱序的
面试题二 - while
输出会是多少呢?
由于 num++ 是异步的,所以执行的次数大于等于 10
由于 while 循环条件阻塞,打印一定在 num >= 10 条件下输出
输出大于等于 10
面试题三 - for
输出会是多少呢?
for 循环保证了循环次数,一定是1000次
for循环不会阻塞后面的 printf 函数执行
故:打印结果小于等于 1000(可能打印的时候还有 ++ 任务未执行完)
面试题三 - 死锁
下面几个分别输出是什么
输出
1,5,2 死锁
分析
串行队列
async 放入队列一个 blockA 任务
blockA 内部又向队列内部添加了一个 blockB 任务
队列需要等待 blockA 执行完毕再执行下一个任务
但是添加 blockB 时,sync 阻断了 blockA 内部的执行,导致 blockA 无法执行完成
所以死锁了
输出
1,5,2,3,4
输出
1,5,2 死锁
和第一个一样
输出
1,2,3,4,5
串行队列
同步任务,没有阻塞队列内任务的执行,没有死锁,正常执行
所以 同步任务 + 串行队列 不一定死锁
二、 任务与队列
Last updated