面试题:你理解的多线程?
面试题: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
网友评论