面灵AI→

CVTE 应用软件研发一面:进程线程、死锁与并发设计

轮次
一面
时间
2026-09
来源
牛客网

《面试题目》

自我介绍与实习

  1. 自我介绍

八股

  1. 进程与线程的区别?
  2. 多线程与线程池的理解?
  3. 线程死锁的四个必要条件?
  4. 如何避免死锁?
  5. 如何安全设计并发编程的代码?
  6. 读写锁了解吗?

算法

  1. LeetCode 1056

反问

  1. 具体业务方向、做什么市场?(to 学校:希沃 / to 企业)
  2. 校招生进去后负责什么?

《参考解析》

  1. 进程与线程别只背「资源分配 vs 调度单位」:要落到具体差异——地址空间与页表是否独立、切换时保存与刷新什么、通信方式(管道/共享内存/消息队列 vs 共享变量加锁)、崩溃是否互相影响。加分点是把协程一起放进坐标轴:进程隔离强、线程共享轻量、协程在用户态调度、切换成本更低但要自己管阻塞。CVTE 是软硬件一体的公司,能顺带说一句「嵌入式/一体机场景里进程隔离带来的稳定性收益」会更贴业务。

  2. 线程池这道题高频,答参数和推演过程:核心线程数、最大线程数、空闲存活时间、任务队列、线程工厂、拒绝策略六件套要能一口气说出来;再补「任务先占核心线程、满了进队列、队列满了才扩到最大线程、再满走拒绝策略」这个执行顺序——记错顺序是面试里最常见的扣分点。参数怎么定:CPU 密集取核数附近,IO 密集按「核数 × (1 + 等待时间/计算时间)」估算,最后一定要落回压测,不要报一个凭感觉的数字。

  3. 死锁四条件是记忆题,避免死锁才是区分题:四个必要条件(互斥、请求并保持、不可剥夺、循环等待)背完立刻转到破环手段——统一加锁顺序(最实用)、tryLock 带超时并回退、把多把锁收敛成一次批量获取、缩小锁粒度或用无锁结构。再补两句工程侧的兜底:线上用 jstack 或线程 dump 定位死锁、加锁路径统一封装、监控锁等待时间。

  4. 「如何安全设计并发代码」是开放题,按层次答:① 能不可变就不可变、能不共享就不共享(线程封闭、局部变量);② 必须共享时选对工具——AtomicXxx 做计数、ConcurrentHashMap 这类并发容器替代手动同步的 HashMap;③ 锁的粒度与顺序统一,避免在锁内做 IO 和远程调用;④ 可见性用 volatile、复合操作不能只靠 volatile;⑤ 最后用压测与并发测试验证,别指望 review 看出来。

  5. 读写锁要答适用场景和代价:读多写少时 ReentrantReadWriteLock 能让多个读并行,写独占;代价是写饥饿(读持续涌入时写线程可能长期拿不到锁)和实现更复杂,所以写比例不低时不如直接用互斥锁或换成更细的分段/无锁结构。能补一句「读写锁不保证读到最新数据的一致性语义,需要强一致时仍要加额外机制」会显得真用过。