美文网首页
底层19:多线程面试题

底层19:多线程面试题

作者: 张无奈 | 来源:发表于2020-09-07 01:00 被阅读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

    相关文章

      网友评论

          本文标题:底层19:多线程面试题

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