C++ 并发编程 常考面试题总结

1. 如何使用std::mutex实现线程同步?

  1. 核心机制:std::mutex是互斥锁,用于保护临界区,保证同一时间只有一个线程执行临界区代码。
  2. 使用方式:直接使用lock()/unlock():需手动加锁解锁,易因异常导致死锁;推荐使用RAII包装器:std::lock_guard(自动加锁解锁,作用域结束自动释放)、std::unique_lock(支持延迟加锁、解锁、超时等待)。
  3. 代码:
#include <mutex>
#include <thread>

std::mutex mtx;
int shared_data = 0;

void increment() {
    std::lock_guard<std::mutex> lock(mtx); // 自动加锁
    shared_data++;
} // 作用域结束,自动解锁

2. 如何避免死锁?举例说明一种策略

  1. 死锁产生条件:互斥、请求与保持、不剥夺、循环等待,破坏任一条件即可避免。
  2. 常见策略:按固定顺序加锁:所有线程按相同顺序获取锁,避免循环等待;超时加锁:使用std::unique_lock的try_lock_for()/try_lock_until(),超时后放弃并释放已持有的锁;避免嵌套锁:同一线程不重复获取同一锁;一次性获取所有锁:使用std::lock()同时获取多个锁,避免部分持有。
  3. (按固定顺序加锁):线程A和线程B都先锁mtx1再锁mtx2,避免循环等待。

3. 解释std::future和std::promise的用法

  1. 核心作用:实现线程间的异步结果传递,std::promise用于设置值,std::future用于获取值。
  2. 使用流程:线程A创建std::promise<T>,通过get_future()获取std::future<T>;线程A将std::promise<T>传递给线程B,线程B执行任务后调用set_value()设置结果;线程A通过std::future<T>的get()/wait()获取或等待结果。
  3. 代码:
#include <future>
#include <thread>

void task(std::promise<int>& p) {
    p.set_value(42); // 设置结果
}

int main() {
    std::promise<int> p;
    std::future<int> f = p.get_future();
    std::thread t(task, std::ref(p));
    int res = f.get(); // 获取结果
    t.join();
    return 0;
}

4. 如何实现线程池?

  1. 核心组件:线程队列:固定数量的工作线程,持续等待任务;任务队列:存储待执行的任务(函数对象/std::function);同步机制:互斥锁+条件变量,实现任务队列的线程安全和线程唤醒。
  2. 实现流程:初始化时创建N个工作线程,线程函数中循环等待任务;提交任务时,将任务加入队列,通过条件变量唤醒空闲线程;线程从队列中取出任务执行,执行完继续等待新任务;销毁时,设置终止标志,唤醒所有线程,等待线程结束。
  3. 关键特性:任务队列线程安全、线程复用、支持任务优先级(可选)。

5. std::atomic在C++11中如何实现原子操作?

  1. 核心原理:基于CPU提供的原子指令(如lock前缀、CAS指令),保证操作在CPU层面不可分割,避免多线程竞态条件。
  2. 实现方式:对内置类型(int、指针等)提供原子封装,支持load()/store()/fetch_add()等原子操作;支持内存序(std::memory_order),控制操作的可见性和重排序;无锁操作,无线程切换开销,性能高于互斥锁。
  3. :std::atomic<int> count = 0; count++;(原子自增,无需加锁)。

6. 解释什

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论
吸吸欧气
点赞 回复 分享
发布于 02-26 22:41 北京
还有没有后续
点赞 回复 分享
发布于 02-26 22:40 北京

相关推荐

不愿透露姓名的神秘牛友
02-10 09:33
点赞 评论 收藏
分享
02-26 09:15
已编辑
蚌埠学院 golang
点赞 评论 收藏
分享
评论
3
11
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务