0

0

c++怎么使用std::mutex来保护共享数据_c++ std::mutex线程保护方法

穿越時空

穿越時空

发布时间:2025-10-03 13:32:02

|

176人浏览过

|

来源于php中文网

原创

使用std::mutex和std::lock_guard可防止多线程数据竞争。1. 包含头文件并声明互斥量保护共享数据;2. 在访问共享数据时用std::lock_guard自动加锁和解锁;3. 多个线程调用受保护函数能保证数据一致性;4. 建议使用RAII避免死锁,按序加锁多个互斥量,合理控制锁粒度,且互斥量不可复制。

c++怎么使用std::mutex来保护共享数据_c++ std::mutex线程保护方法

在多线程编程中,多个线程同时访问共享数据可能导致数据竞争和未定义行为。C++ 提供了 std::mutex(互斥量)来保护共享资源,确保同一时间只有一个线程可以访问该资源。

1. 包含头文件并声明互斥量

使用 std::mutex 前,需要包含 头文件。然后定义一个互斥量对象,用于保护特定的共享数据。

#include iostream>
#include
#include

int shared_data = 0;
std::mutex mtx; // 互斥量,用于保护 shared_data

2. 在关键代码段加锁保护

每当线程要读写共享数据时,必须先通过 lock() 获取锁,操作完成后调用 unlock() 释放锁。更推荐使用 std::lock_guard,它能自动管理锁的生命周期,避免忘记解锁。

void safe_increment() {
    std::lock_guard<:mutex> lock(mtx); // 自动加锁
    ++shared_data; // 安全修改共享数据
    // 离开作用域时自动解锁
}

3. 多线程并发访问示例

创建多个线程同时调用受保护的函数,观察数据一致性。

千面数字人
千面数字人

千面 Avatar 系列:音频转换让静图随声动起来,动作模仿让动漫复刻真人动作,操作简单,满足多元创意需求。

下载

立即学习C++免费学习笔记(深入)”;

void worker() {
    for (int i = 0; i         safe_increment();
    }
}

int main() {
    std::thread t1(worker);
    std::thread t2(worker);

    t1.join();
    t2.join();

    std::cout     return 0;
}

4. 使用建议与注意事项

  • 始终成对使用 lock/unlock:手动加解锁容易出错,优先使用 std::lock_guardstd::unique_lock 实现 RAII 管理。
  • 避免死锁:如果需要多个互斥量,应始终按相同顺序加锁。
  • 粒度适中:锁的范围不宜过大,否则影响并发性能;也不宜过小,导致保护不足。
  • 不能复制互斥量std::mutex 是不可复制和不可移动的,类中包含 mutex 时要注意。

基本上就这些。只要在每次访问共享数据前获取 mutex 锁,并借助 RAII 工具(如 lock_guard),就能有效防止数据竞争,写出线程安全的 C++ 代码。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

338

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

542

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

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

53

2025.08.29

C++中int的含义
C++中int的含义

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

197

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

175

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

97

2025.11.27

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

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

482

2023.08.10

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

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

143

2025.12.24

html编辑相关教程合集
html编辑相关教程合集

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

16

2026.01.21

热门下载

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

精品课程

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

共94课时 | 7.3万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号