理想汽车 后端开发-C++ 二面
1. 项目中遇到的问题及解决方案
2. 多线程结构从有锁到无锁的改进点
- 消除锁竞争、线程阻塞与上下文切换
- 使用原子操作 atomic 替代锁
- 使用 CAS 实现无锁更新
- 无锁队列/环形缓冲区
- 线程数据隔离,减少共享资源
- 避免死锁、优先级反转
3. unique_lock 和 lock_guard 的共同点和区别
共同点:
- 都是 RAII 风格,自动加锁、自动解锁
- 防止异常导致死锁
区别:
- lock_guard:轻量、无额外开销、不能手动解锁
- unique_lock:灵活、支持手动 lock/unlock、可转移所有权、可配合条件变量、性能略低
4. 项目场景相关问题
5. 实习相关问题
6. 是否熟悉 CUDA 编程
了解核函数、线程块、共享内存,可用于并行计算加速,适用于模型推理、矩阵运算、图像处理等场景。
7. 短期内职业规划
深耕 C++ 高性能/高并发开发方向,专注自动驾驶领域;夯实底层原理、性能优化、高并发架构;快速成长为能独立负责核心模块的开发工程师。
8. 条件变量为什么必须配合 unique_lock?
- 条件变量需要在等待时自动解锁、唤醒时重新加锁
- lock_guard 不支持手动解锁,无法满足
- 只有 unique_lock 具备 lock/unlock 能力,因此必须配合使用
9. C++ 内存序 memory_order 的作用?常用三种?
- 解决多线程下指令重排、可见性问题
- memory_order_relaxed:无同步,仅保证原子性
- memory_order_acquire / release:读写屏障,解决可见性
- memory_order_seq_cst:全局一致,默认模式,最安全
10. shared_ptr 引用计数是线程安全的吗?对象呢?
- 引用计数是线程安全的,底层用原子操作
- 对象本身不是线程安全的,读写对象仍需要加锁
11. epoll 水平触发 LT 与 边缘触发 ET 区别?
- LT:只要有数据就持续触发,易用
- ET:只有状态变化时触发,效率更高,必须非阻塞
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++ 常考面试题总结 文章被收录于专栏
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.
查看11道真题和解析