卡码笔记
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
首页
计算机基础
C++
Java
面经
笔记广场 (opens new window)
代码随想录 (opens new window)
  • 基础与语法

  • 面向对象

  • STL 与容器

  • 内存管理

  • C++11 与现代 C++

    • C++11中的新特性有哪些
    • C++11中的多线程编程
      • 简要回答
      • 详细回答
      • 代码示例
      • 知识拓展
    • 左值引用和右值引用的区别
    • 移动语义有什么作用,原理是什么
    • 完美转发的作用及实现
    • 说一下c++中stdmove与stdforward的区别
    • 说一下lambda函数
    • 仿函数与lambda性能对比
    • c++中 STL中仿函数与lambda表达式的性能对比
    • C++中的RAII机制
    • C++中的异常处理机制
    • C++中的协程概念及实现
  • 智能指针

  • 并发与 I/O

# 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;
}
1
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

​

# 知识拓展

  • 知识图解 image image

  • 适用场景

适合使用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在作用域内始终保持锁定状态。

Last Updated: 3/10/2026, 6:08:48 PM

← C++11中的新特性有哪些 左值引用和右值引用的区别 →

评论

验证登录状态...

侧边栏
夜间
卡码简历
代码随想录
卡码投递表🔥
2026群
添加客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记
鼓励/支持/赞赏Carl
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪