C++中的并发与锁怎么用?C++ mutex互斥锁使用教程【多线程安全】

阿宇同学_7568

阿宇同学_7568

2025-12-14

287人浏览

原创

多线程中需用std::mutex等同步机制保证共享数据访问安全,核心是所有读写均须在持锁下进行;推荐RAII方式如std::lock_guard或std::unique_lock管理锁,避免手动lock/unlock出错;注意mutable修饰互斥量以支持const函数加锁,多锁场景优先用std::scoped_lock防死锁。

c++中的并发与锁怎么用?c++ mutex互斥锁使用教程【多线程安全】

多线程环境下,多个线程同时访问共享数据容易引发数据竞争(data race),导致结果不可预测。C++ 提供 std::mutex 等同步机制来保证线程安全,核心原则是:**任何对共享资源的读写,都必须在持有互斥锁的前提下进行**。

mutex 基本用法:加锁、解锁、RAII 自动管理

手动调用 lock() 和 unlock() 容易出错(比如忘记解锁、异常跳过解锁)。推荐使用 RAII 封装类:std::lock_guard(作用域内自动加锁/解锁)或更灵活的 std::unique_lock。

  • std::lock_guard<:mutex> guard(mtx); —— 构造时加锁,离开作用域自动解锁(不能转移、不可复制)
  • std::unique_lock<:mutex> lock(mtx); —— 支持延迟加锁、手动解锁、条件变量配合等
  • 不要手动调用 mtx.unlock() 配合 lock_guard,否则会触发未定义行为

保护共享变量:典型线程安全计数器示例

下面是一个带锁的线程安全计数器:

class ThreadSafeCounter {
    mutable std::mutex mtx;
    int value = 0;
public:
    void increment() {
        std::lock_guard<:mutex> lock(mtx);
        ++value;
    }
    int get() const {
        std::lock_guard<:mutex> lock(mtx);
        return value;
    }
};</:mutex></:mutex>

注意:mutable 允许在 const 成员函数中修改互斥量(因为锁操作不改变逻辑状态);get() 是 const 函数,但内部仍需加锁读取共享值。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

避免死锁:按固定顺序加锁 & 使用 std::scoped_lock

多个互斥量同时使用时,若线程 A 锁 mtx1 再锁 mtx2,而线程 B 反过来先锁 mtx2 再锁 mtx1,就可能死锁。

  • 统一加锁顺序(如地址大小、ID 编号)——需人工约定,易出错
  • 更推荐:用 std::scoped_lock(C++17 起),可安全同时锁定多个互斥量,自动避免死锁
  • 示例:std::scoped_lock lock(mtx1, mtx2); —— 内部按无死锁策略加锁,构造成功才全部持有

常见误区与注意事项

实际开发中容易踩坑的地方:

  • 只保护写操作,忽略读操作——读操作同样需要锁(除非用原子类型或读写锁)
  • 锁粒度太大(如整个函数都持锁)→ 性能差;太小(如每行都加锁)→ 逻辑错误或漏锁
  • 在持有锁时调用未知外部函数(如用户回调、IO、new/delete)——可能阻塞或抛异常,延长持锁时间甚至引发死锁
  • std::mutex 不可拷贝、不可移动,只能通过引用或指针共享;多个线程应共用同一个 mutex 实例

基本上就这些。用好 mutex 的关键是:明确共享数据边界、最小化临界区、优先用 RAII、警惕死锁和异常路径。不复杂但容易忽略细节。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2298

7

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

379

31

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

4458

6

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

2025.12.24

1249

20

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.21

423

30

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

2026.01.21

579

24

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

429

20

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

2026.03.16

253

22

Java 多线程与并发编程实战
Java 多线程与并发编程实战

深入讲解 Java 并发编程体系,涵盖 Thread / Runnable / Callable 线程创建方式、线程生命周期与状态转换、synchronized 同步锁与 Lock/ReentrantLock 显式锁、volatile 可见性保证、ThreadPool 线程池配置与调优(核心参数/拒绝策略)、JUC 并发工具类(CountDownLatch/CyclicBarrier/Semaphore/ConcurrentHashMa

2026.04.17

369

31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程