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

特点:

快转字幕
快转字幕

新一代 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不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

546

2023.08.10

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

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

210

2025.12.24

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

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

20

2026.01.21

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

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

19

2026.01.21

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

热门下载

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

精品课程

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

共55课时 | 6.4万人学习

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

共11课时 | 1.5万人学习

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

共21课时 | 12.1万人学习

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

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