0

0

c++中如何使用互斥锁_c++互斥锁使用方法

冰火之心

冰火之心

发布时间:2025-10-07 08:06:02

|

1018人浏览过

|

来源于php中文网

原创

C++中互斥锁用于保护共享数据,防止多线程竞争。std::mutex需配合std::lock_guard或std::unique_lock使用,前者自动加解锁,后者支持延迟和手动控制。还提供recursive_mutex、timed_mutex等类型适应递归和超时场景,建议使用RAII机制管理锁,减小锁粒度,避免死锁。

c++中如何使用互斥锁_c++互斥锁使用方法

在C++中,互斥锁(mutex)用于保护共享数据,防止多个线程同时访问造成数据竞争。标准库提供了多种互斥锁类型和配套的锁管理工具,使用起来既安全又方便。

1. 基本互斥锁:std::mutex

最常用的互斥锁是 std::mutex。它本身不提供自动加锁和解锁功能,需要配合 std::lock_guardstd::unique_lock 使用,以确保异常安全。

示例代码:

#include 
#include 
#include 

std::mutex mtx;

void print_block(int n, char c) {
    std::lock_guard lock(mtx); // 自动加锁
    for (int i = 0; i < n; ++i) {
        std::cout << c;
    }
    std::cout << '\n'; // 自动解锁(离开作用域)
}

int main() {
    std::thread t1(print_block, 10, '*');
    std::thread t2(print_block, 10, '-');
    t1.join();
    t2.join();
    return 0;
}
在这个例子中,std::lock_guard 在构造时加锁,析构时自动解锁,避免了忘记解锁或异常导致死锁的问题。

2. 灵活控制:std::unique_lock

如果需要更灵活的操作,比如延迟加锁、手动解锁或条件变量配合,可以使用 std::unique_lock

特点:

ChatGPT Website Builder
ChatGPT Website Builder

ChatGPT网站生成器,AI对话快速生成网站

下载
  • 支持延迟加锁(传入 std::defer_lock
  • 可随时调用 lock()unlock()
  • 可用于条件变量(std::condition_variable
示例:
std::mutex mtx;
std::unique_lock lock(mtx, std::defer_lock);
// 其他操作...
lock.lock(); // 手动加锁
// 访问共享资源
lock.unlock(); // 手动解锁

3. 其他类型的互斥锁

C++标准还提供了其他互斥锁类型,适用于不同场景:
  • std::recursive_mutex:允许同一线程多次加锁,适合递归调用
  • std::timed_mutex:支持超时加锁(try_lock_for, try_lock_until)
  • std::recursive_timed_mutex:递归 + 超时功能

带超时的示例:

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

std::timed_mutex t_mtx;

if (t_mtx.try_lock_for(std::chrono::seconds(1))) {
    // 成功获取锁
    // 操作共享资源
    t_mtx.unlock();
} else {
    // 超时未获取到锁
    std::cout << "Lock timeout\n";
}

4. 注意事项与最佳实践

使用互斥锁时需注意以下几点:
  • 尽量使用 RAII(如 lock_guard、unique_lock),避免手动调用 lock/unlock
  • 锁的粒度要小,只保护真正需要同步的代码段
  • 避免在持有锁时执行耗时操作(如I/O、网络请求)
  • 防止死锁:多个锁时保持一致的加锁顺序
基本上就这些。掌握好 mutex 配合 lock_guard 或 unique_lock 的使用,就能有效保护多线程下的共享数据安全。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

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

525

2023.08.10

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

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

187

2025.12.24

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

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

19

2026.01.21

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

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

16

2026.01.21

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

9

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

8

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

3

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
计算机网络知识集合
计算机网络知识集合

共55课时 | 6.3万人学习

PHP基本语法(玉女心经版)
PHP基本语法(玉女心经版)

共11课时 | 1.5万人学习

SSDB数据库使用手册
SSDB数据库使用手册

共21课时 | 12万人学习

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

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