南京予芯 C++开发 二面
1. 你在程序中是如何加锁的,代码怎样写
答案:实际开发中优先使用RAII风格的锁,避免手动加解锁导致的死锁和异常安全问题,常用std::lock_guard和std::unique_lock,前者简单高效,后者支持条件变量、超时等灵活操作。多线程临界区加锁时,会尽量缩小锁的粒度,避免锁中嵌套锁,同时统一加锁顺序防止死锁。
#include <mutex>
#include <vector>
std::mutex mtx;
std::vector<int> shared_data;
void safe_push(int val) {
std::lock_guard<std::mutex> lock(mtx);
shared_data.push_back(val);
}
void safe_pop(int& val) {
std::unique_lock<std::mutex> lock(mtx);
if (!shared_data.empty()) {
val = shared_data.back();
shared_data.pop_back();
}
}
2. 进程通信的方法,什么是管道,什么是共享内存,他们两者如何做选择
答案:进程间通信常见方式有管道、共享内存、消息队列、信号量、套接字等。管道是半双工的通信方式,分为匿名管道(亲缘进程间)和命名管道(无亲缘进程间),基于内核缓冲区实现,数据只能单向流动;共享内存是直接在物理内存中开辟一块区域,多个进程映射到自身虚拟地址空间,是最快的IPC方式,无需数据拷贝。选择上,管道实现简单、自带同步,适合小数据、流式传输;共享内存速度极快,适合大数据量高频交互,但需要自行实现同步互斥,避免数据竞争。
3. 说一下C++11的一些新特性,auto类型替换的原理
答案:C++11核心新特性包括右值引用与移动语义、智能指针、auto/decltype、lambda表达式、范围for、nullptr、线程库、emplace系列容器方法等。auto的原理是编译期类型推导,编译器根据变量的初始化表达式,在编译阶段推导出变量的实际类型,替换auto关键字,不会产生运行时开销,仅简化代码编写,不影响程序性能,注意auto不能用于函数参数和类成员变量声明。
4. 僵尸进程是什么,如何解决
答案:僵尸进程是子进程退出后,父进程没有调用wait/waitpid回收其PCB资源,导致子进程PCB残留在内核中的进程,不占用内存和CPU,但会浪费进程号资源,大量僵尸进程会耗尽系统进程号。解决方式:父进程调用wait/waitpid阻塞或非阻塞回收;通过信号SIGCHLD注册处理函数,在信号处理函数中批量回收;两次fork,让子进程成为孤儿进程被init进程收养,自动回收资源;使用线程池避免频繁创建子进程。
5. fork创建子进程和克隆的区别
答案:fork创建子进程时,会复制父进程的地址空间(写时复制),子进程拥有独立的进程空间,父子进程执行流独立,共享文件描述符;clone是更底层的系统调用,可灵活控制子进程共享父进程的资源,如共享地址空间、文件系统、信号处理等,常用于实现线程,fork本质是clone的封装,默认不共享地址空间,而clone可按需共享资源,实现轻量级进程。
6. ARP协议是在哪一层,他有没有端口号
答案:ARP协议工作在数据链路层(网络层与数据链路层之间),作用是根据IP地址解析MAC地址,实现局域网内设备通信。端口号是传输层(TCP/UDP)的概念,用于区分同一主机上的不同应用进程,ARP协议不基于传输层,因此没有端口号。
7. 介绍下你做的这个项目
8. 为什么用protobuf不用jsoncpp
9. 如何实现多线程并发的
10. 什么是写时复制,底层实现原理
答案:写时复制(COW)是一种延迟复制技术,fork创建子进程时,不会立即复制父进程的地址空间,而是让父子进程共享同一块物理内存,页表标记为只读。当父子进程任意一方修改内存时,触发缺页异常,内核复制该页内存,修改页表指向新的物理地址,实现进程间地址空间隔离。写时复制大幅减少了fork的开销,避免了不必要的内存复制,提升了进程创建效率,是Linux进程创建的核心机制。
11. 什么是自旋锁,与互斥锁的区别与适用场景
答案:自旋锁是一种忙等待锁,线程获取锁失败时,会循环检查锁是否可用,不进入阻塞状态,避免上下文切换开销;互斥锁获取失败时,线程会阻塞,让出CPU,等待唤醒。区别:自旋锁不阻塞,适合锁持有时间极短的场景,避免上下文切换开销;互斥锁阻塞,适合锁持有时间长的场景,避免CPU空转。适用场景:自旋锁用于内核态、短临界区;互斥锁用于用户态、长临界区。
#include <atomic>
struct SpinLock {
std::atomic<bool> flag{fal
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

查看15道真题和解析