news 2026/7/26 12:55:43

c++14 四种互斥锁

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c++14 四种互斥锁

在C++14中,标准库提供了四种互斥锁类型,它们均定义在头文件中,用于多线程编程中保护共享资源,防止数据竞争。以下是具体分类及示例说明:

  1. std::mutex(基础互斥锁)
    功能:最基本的互斥锁,确保同一时间只有一个线程能访问共享资源。
    特点:
    非递归:同一线程重复加锁会导致未定义行为(死锁)。
    无超时机制:调用lock()时若锁已被占用,线程会阻塞直到获取锁。
    示例:
    cpp
    #include
    #include
    #include

std::mutex mtx;
int shared_data = 0;

void increment() {
mtx.lock(); // 加锁
++shared_data; // 访问共享资源
mtx.unlock(); // 解锁
}

int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Shared data: " << shared_data << std::endl; // 输出 2
return 0;
}
问题:手动管理锁易出错(如未解锁或异常导致死锁)。推荐使用RAII包装类(如std::lock_guard或std::unique_lock)自动管理锁生命周期。
2. std::recursive_mutex(递归互斥锁)
功能:允许同一线程多次加锁,适用于递归调用场景。
特点:
递归支持:同一线程可重复加锁,但需对应次数的解锁。
无超时机制:阻塞式加锁。
示例:
cpp
#include
#include
#include

std::recursive_mutex rmtx;
int shared_data = 0;

void recursive_increment(int n) {
rmtx.lock();
if (n > 0) {
++shared_data;
recursive_increment(n - 1); // 递归调用
}
rmtx.unlock();
}

int main() {
std::thread t1(recursive_increment, 5);
t1.join();
std::cout << "Shared data: " << shared_data << std::endl; // 输出 5
return 0;
}
适用场景:函数内部递归调用且需保护共享资源时(如递归遍历树结构并修改节点数据)。
3. std::timed_mutex(带超时的互斥锁)
功能:在std::mutex基础上增加超时机制,避免无限阻塞。
特点:
支持try_lock_for():尝试在指定时间内获取锁。
支持try_lock_until():尝试在指定时间点前获取锁。
示例:
cpp
#include
#include
#include
#include

std::timed_mutex tmtx;
int shared_data = 0;

void timed_increment() {
if (tmtx.try_lock_for(std::chrono::milliseconds(100))) { // 尝试在100ms内获取锁
++shared_data;
tmtx.unlock();
} else {
std::cout << “Failed to acquire lock within timeout.” << std::endl;
}
}

int main() {
std::thread t1(timed_increment);
std::thread t2(timed_increment);
t1.join();
t2.join();
std::cout << "Shared data: " << shared_data << std::endl; // 输出 1 或 2(取决于锁竞争)
return 0;
}
适用场景:对实时性要求较高的场景(如游戏、高频交易),避免因锁竞争导致线程长时间阻塞。
4. std::recursive_timed_mutex(带超时的递归互斥锁)
功能:结合std::recursive_mutex和std::timed_mutex的特性,支持递归调用和超时机制。
特点:
递归支持:同一线程可多次加锁。
超时支持:通过try_lock_for()或try_lock_until()避免无限阻塞。
示例:
cpp
#include
#include
#include
#include

std::recursive_timed_mutex rtmtx;
int shared_data = 0;

void recursive_timed_increment(int n) {
if (rtmtx.try_lock_for(std::chrono::milliseconds(50))) { // 尝试在50ms内获取锁
if (n > 0) {
++shared_data;
recursive_timed_increment(n - 1); // 递归调用
}
rtmtx.unlock();
} else {
std::cout << “Failed to acquire lock within timeout.” << std::endl;
}
}

int main() {
std::thread t1(recursive_timed_increment, 3);
t1.join();
std::cout << "Shared data: " << shared_data << std::endl; // 输出 3 或因超时未完成
return 0;
}
适用场景:递归调用且需避免死锁的实时系统(如嵌入式开发)。
总结
锁类型 核心特性 适用场景
std::mutex 基础互斥,非递归,无超时 简单临界区保护
std::recursive_mutex 递归支持,无超时 递归调用保护共享资源
std::timed_mutex 带超时,非递归 实时系统,避免无限阻塞
std::recursive_timed_mutex 递归+超时 递归调用且需超时控制的场景
推荐实践:

优先使用RAII包装类:如std::lock_guard或std::unique_lock自动管理锁生命周期,避免手动解锁错误。
cpp
std::mutex mtx;
void safe_increment() {
std::lock_guardstd::mutex lock(mtx); // 自动加锁/解锁
++shared_data;
}
根据需求选择锁类型:
无需递归或超时 → std::mutex。
递归调用 → std::recursive_mutex。
实时性要求高 → std::timed_mutex或std::recursive_timed_mutex。
避免锁竞争:缩小临界区范围,减少锁持有时间,提升并发性能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 5:11:28

LangFlow与Origin数据分析软件联动应用探索

LangFlow与Origin数据分析软件联动应用探索 在科研和工程实践中&#xff0c;我们常常面临一个矛盾&#xff1a;一方面&#xff0c;大语言模型&#xff08;LLM&#xff09;具备强大的语义理解与信息提取能力&#xff1b;另一方面&#xff0c;专业级数据可视化仍依赖如 Origin 这…

作者头像 李华
网站建设 2026/7/24 4:05:23

libxml2 XML解析库:鸿蒙PC上的XML处理工具

ohos-libxml2 是为 OpenHarmony 平台编译的 libxml2 XML 解析库。本文档详细介绍如何在鸿蒙PC上安装和使用官方适配完成的 libxml2 库&#xff0c;包括 HNP 包的打包、安装和使用方法。 &#x1f4cb; 目录 一、项目概述二、为什么需要 HNP 包三、HNP 包打包方法四、安装与使用…

作者头像 李华
网站建设 2026/7/23 18:13:04

螺蛳粉鸭脚煲市场深度研究报告:聚焦那巷那螺发展态势与行业趋势

1.1 研究背景与目的螺蛳粉鸭脚煲融合螺蛳粉酸辣鲜爽与鸭脚软糯口感&#xff0c;发源于广西柳州街头&#xff0c;借社交媒体传播从地方小吃走向全国&#xff0c;成为餐饮行业新兴热门品类。本研究旨在剖析该品类市场现状、消费需求及竞争格局&#xff0c;为企业决策提供支持&…

作者头像 李华
网站建设 2026/7/24 23:03:42

Langchain-Chatchat集成MindIE与Xinference实战

Langchain-Chatchat集成MindIE与Xinference实战 在企业级智能问答系统日益普及的今天&#xff0c;如何在保障数据隐私的前提下实现高性能推理&#xff0c;成为技术选型的核心挑战。尤其对于政企客户而言&#xff0c;私有化部署不仅是合规要求&#xff0c;更是业务连续性的关键支…

作者头像 李华
网站建设 2026/7/25 21:05:26

年前可见刊!版面费破天荒$399,只要格式OK基本无返修直录

知网/谷歌期刊作用01学术和职业发展发表知网普刊论文可以帮助学生提高学术能力和研究水平&#xff0c;增加保研和求职的竞争力。02加分和评奖知网普刊论文可以用于加学分、评奖学金、评优评奖等。这对于在校学生来说是一个非常实际的优势&#xff0c;因为这些期刊相对容易发表&…

作者头像 李华
网站建设 2026/7/24 16:18:42

Docker安装TensorRT时挂载GPU设备的权限配置

Docker安装TensorRT时挂载GPU设备的权限配置 在AI模型从实验室走向生产部署的过程中&#xff0c;一个常见的痛点浮出水面&#xff1a;明明在本地能跑得飞快的推理代码&#xff0c;一放进Docker容器就报错“找不到GPU”或者“CUDA初始化失败”。尤其是在使用NVIDIA TensorRT进行…

作者头像 李华