news 2026/6/9 20:39:19

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/6/10 13:33:51

91n网络环境下最优TensorFlow镜像拉取方案

91n网络环境下最优TensorFlow镜像拉取方案 在金融、制造等对安全与稳定性要求极高的企业环境中&#xff0c;AI模型的部署早已不再是“能不能跑”的问题&#xff0c;而是“能否稳定、快速、可复制地交付”。尤其是在类似“91n”这类受限内网中——外网访问受限、DNS解析不稳定、…

作者头像 李华
网站建设 2026/6/10 13:33:00

gpt-oss-20b模型下载与部署全指南

gpt-oss-20b模型部署实战&#xff1a;如何在消费级GPU上运行类GPT-4级别的开源大模型 你有没有遇到过这样的困境&#xff1f;想用一个强大的开源大模型做本地推理&#xff0c;结果发现不是显存爆了&#xff0c;就是加载半小时还没跑起来。Llama 70B太重&#xff0c;Mistral又不…

作者头像 李华
网站建设 2026/6/10 13:35:35

本地部署HunyuanVideo-Foley:视频自动生成音效教程

本地部署HunyuanVideo-Foley&#xff1a;视频自动生成音效实战指南 你有没有试过剪辑一段情绪饱满的短片&#xff0c;画面张力拉满&#xff0c;节奏层层递进&#xff0c;结果一播放——死寂一片&#xff1f;&#x1f631; 想加点环境氛围、脚步回响、玻璃碎裂声……可翻遍音效库…

作者头像 李华
网站建设 2026/6/10 13:39:02

YOLOv8改进策略【Conv和Transformer】| CVPR 2023:Super Token Attention 超级令牌注意力机制

一、本文介绍 本文记录的是利用Super Token Attention(STA)机制优化YOLOv8的目标检测网络模型。 传统视觉Transformer的全局自注意力机制虽能捕捉长程依赖,但计算复杂度与令牌数量呈二次关系,资源占用极大;局部注意力或早期卷积虽降低了计算量,却牺牲了全局建模能力,且…

作者头像 李华
网站建设 2026/6/10 13:35:00

基于PaddlePaddle的中文NLP开发环境搭建:CUDA安装与git配置全攻略

基于PaddlePaddle的中文NLP开发环境搭建&#xff1a;CUDA安装与git配置全攻略 在当今AI研发实践中&#xff0c;一个稳定、高效且可协作的开发环境&#xff0c;往往比算法本身更能决定项目的成败。尤其是在处理中文自然语言任务时&#xff0c;面对分词歧义、语义依赖复杂、上下…

作者头像 李华
网站建设 2026/6/9 22:28:06

Qwen3-VL-8B:轻量多模态模型的实用落地

Qwen3-VL-8B&#xff1a;轻量多模态模型的实用落地 在智能家居设备日益复杂的今天&#xff0c;确保无线连接的稳定性已成为一大设计挑战。然而&#xff0c;当我们把目光转向AI领域&#xff0c;类似的困境也在上演——越来越多惊艳的多模态模型如雨后春笋般涌现&#xff0c;但真…

作者头像 李华