news 2026/6/15 0:03:52

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/15 10:52:09

DeepSeek-V2.5实战:高效部署与推理指南

DeepSeek-V2.5实战&#xff1a;高效部署与推理指南 在大模型真正落地的战场上&#xff0c;跑得通只是起点&#xff0c;跑得快、稳得住才是关键。DeepSeek-V2.5 作为当前中文开源大模型中的佼佼者&#xff0c;其强大的语言生成能力背后&#xff0c;是对计算资源的极致要求。你有…

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

LobeChat能否接入物联网设备?智能家居控制中枢设想

LobeChat能否接入物联网设备&#xff1f;智能家居控制中枢设想 在智能家居日益普及的今天&#xff0c;越来越多的家庭开始部署智能灯、温控器、安防摄像头等设备。然而&#xff0c;一个尴尬的现实是&#xff1a;这些设备往往分散在不同的App中&#xff0c;语音助手只能支持部分…

作者头像 李华
网站建设 2026/6/15 13:47:36

Qwen3-8B模型pipeline流式与非流式调用实战

Qwen3-8B模型pipeline流式与非流式调用实战 在当前大语言模型&#xff08;LLM&#xff09;快速普及的背景下&#xff0c;越来越多开发者开始关注如何在有限硬件资源下高效部署高性能模型。阿里云推出的 Qwen3-8B 正是这一趋势下的理想选择——它以仅80亿参数的“轻量级”规模&a…

作者头像 李华
网站建设 2026/6/15 10:01:31

PaddlePaddle模型训练技巧:结合diskinfo下载监控IO性能瓶颈

PaddlePaddle模型训练中的I/O瓶颈诊断&#xff1a;用diskinfo精准定位磁盘性能问题 在现代深度学习项目中&#xff0c;GPU算力的提升速度远超存储系统的响应能力。我们常常遇到这样的场景&#xff1a;明明配备了顶级A100显卡&#xff0c;训练速度却迟迟上不去——查看nvidia-sm…

作者头像 李华
网站建设 2026/6/14 15:21:41

重磅!原中科院2区TOP期刊,因学术造假,被踢出SCI!

重磅&#xff01;12月WOS目录更新&#xff0c;SCI/SSCI/AHCI目录共3本期刊发生变动&#xff0c;其中On Hold长达14个月的中科院2区期刊《JOURNAL OF MOLECULAR LIQUIDS》在最终评估后被SCI数据库剔除&#xff01;ESCI目录共78本期刊发生变动&#xff0c;此前3本被On Hold的ESCI…

作者头像 李华