底层19:多线程面试题

2020-09-07  本文已影响0人  张无奈

面试题:你理解的多线程?

面试题:iOS的多线程方案有哪几种?你更倾向于哪一种?

面试题:你在项目中用过GCD吗?

面试题:GCD的队列类型?

并发队列、串行队列。

面试题:说一下OperationQueue和GCD的区别,以及各自的优势

面试题:线程安全的处理手段有哪些?

使用线程同步技术(同步,就是协同步调,按预定的先后次序进行运行)

常见的线程同步技术:加锁

面试题:OC你了解的锁有哪些?在你回答基础上进行2次提问?

追问1:自旋和互斥对比?

自旋锁、互斥锁比较

什么时候使用自旋锁比较好?

预计线程等待锁的时间很短;

加锁的代码(临界区(lock与unlock之间))经常被调用,但竞争情况很少发生;

CPU资源不紧张;

多核处理器;

什么时候使用互斥锁比较好?

预计线程等待锁的时间较长;

单核处理器;

临界区有IO操作(文件操作);

临界区代码复制或者循环量大;

临界区竞争非常激烈;

追问2:使用以上锁需要注意哪些?

追问3:用C/OC/C++,任选其一,实现自旋或互斥?口述即可!

面试题:下面代码打印结果?

显然打印为:1 3

原因是:[self performSelector:@selector(test) withObject:nil afterDelay:.0];的本质是往RunLoop中添加定时器,而子线程默认没有启动runLoop。所以需要手动启动:

打印:132

其中addPort:这一句代码可以不要,原因是上面performSelector:已经添加到timer,而线程不会死的要素是里面有timer或者source任务去等待它执行。

[self performSelector:@selector(test) withObject:nil]跟它是不一样的,没有关系到RunLoop,如果它不启动照常打印。

面试题:请问下面的代码打印结果是什么?

执行结果:打印1,并报错。

分析:在同一子线程打印1和执行下面的performSelector:方法, 当启动start线程的时候,打印1,然后block中的方法执行完,就代表任务执行完成,线程就会退出,这是再执行test显然就会报错,目标线程找不到。优化:

打印:12

上一篇下一篇

猜你喜欢

热点阅读