# C++11多线程编程与锁
面试时没有回答好问题是很正常的,被面试官质疑时,要有今天不会明天会的底气,面后做好复盘,不在同一道题目上跌倒第二次,今天就从 C++11多线程编程与锁 背起来
# 简要回答
C++11引入了原生多线程支持,通过 thread 头文件提供线程管理,
mutex提供互斥锁机制,
condition_variable提供条件变量,实现了跨平台的线程同步。
主要锁类型包括mutex、recursive_mutex、timed_mutex等,配合lock_guard、unique_lock等RAII包装器实现资源安全管理。
# 详细回答
C++11的多线程编程体系包含以下几个核心组件:
线程管理:std::thread类用于创建和管理线程,支持可调用对象、函数指针、lambda表达式等多种线程入口点。
互斥锁机制:
std::mutex:基本互斥锁
std::recursive_mutex:可重入互斥锁
std::timed_mutex:带超时功能的互斥锁
std::recursive_timed_mutex:可重入带超时互斥锁
RAII锁管理:
std::lock_guard:简单的作用域锁
std::unique_lock:更灵活的锁管理,支持延迟锁定、条件变量等
条件变量:std::condition_variable用于线程间通信,实现等待-通知机制。
原子操作:std::atomic提供无锁编程支持,适用于简单的数据同步。
# 代码示例
##基础mutex使用
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
std::mutex g_mutex;
int g_counter = 0;
void increment() {
for (int i = 0; i < 100000; ++i) {
std::lock_guard<std::mutex> lock(g_mutex);
++g_counter;
}
}
int main() {
std::vector<std::thread> threads;
for (int i = 0; i < 10; ++i) {
threads.emplace_back(increment);
}
for (auto& t : threads) {
t.join();
}
std::cout << "Final counter: " << g_counter << std::endl;
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 知识拓展
知识图解

适用场景
适合使用C++11多线程的场景: 计算密集型任务:图像处理、科学计算等需要并行计算
I/O密集型应用:网络服务器、文件处理等等待I/O时切换线程
实时数据处理:数据采集、监控系统等需要并发处理
GUI应用程序:保持界面响应性,后台执行耗时任务
游戏开发:并行处理物理计算、AI、渲染等
- 面试官可能追问
Q1: lock_guard和unique_lock有什么区别? 答案:
A1:lock_guard更轻量,构造时立即锁定,析构时自动解锁,不支持手动控制
unique_lock更灵活,支持延迟锁定、手动锁定解锁、条件变量配合使用
性能上lock_guard更好,unique_lock功能更全但稍重
Q2: 什么是死锁?如何避免?
A2:死锁是多个线程互相等待对方释放资源导致的永久阻塞。避免方法:
1.统一锁定顺序
2.使用std::lock同时锁定多个mutex
3.使用RAII包装器
4.避免在持有锁时调用未知代码
5.使用超时机制
Q3: 条件变量为什么要和unique_lock配合使用?
A3:因为condition_variable::wait()需要能够临时释放锁让其他线程运行,并在条件满足时重新获取锁。
unique_lock支持这种灵活的锁定机制,而lock_guard在作用域内始终保持锁定状态。
评论
验证登录状态...