新闻详情

新闻详情

首页 / 资讯中心 / 详情

互斥锁管理之unique_lock学习

发布时间:2026/9/1 1:23:07来源:尧图网络
互斥锁管理之unique_lock学习
前面学习了std::lock_guard和std::scoped_lock,lock_guard的功能是自动解锁能有效避免忘记unlock()的情况。但只能锁定一个互斥锁scoped_lock比lock_guard高级可以同时锁定多个互斥体。而unique_lock比它们更灵活。它‌独占管理互斥量所有权‌析构时自动解锁仅当持有锁时且‌不可复制但可移动‌支持延迟加锁、手动解锁/加锁、尝试加锁、超时加锁及所有权转移是唯一能与 std::condition_variable 配合使用的锁包装器。下面来看它的使用//unique_lock.cpp unique_lock example //#include iostream // std::cout #include thread // std::thread #include mutex // std::mutex //临界区互斥锁 std::mutex mtx; // mutex for critical section int g_count 0; //自增函数测试 void incrementation() { printf(incrementationstart lock\n); //std::lock_guardstd::mutex lock(mtx); std::unique_lockstd::mutex lock(mtx); for (int i 0; i 1000000; i) { g_count; } //模拟耗时 std::this_thread::sleep_for(std::chrono::seconds(1)); //休眠1秒 printf(incrementationend lock\n); } int main() { std::thread t1(incrementation); std::thread t2(incrementation); t1.join(); t2.join(); //理论应该 2000000不加锁实际永远小于这个数 printf(g_count%d\n, g_count); printf(hello learn unique_lock\n); return 0; }编译运行这个例子说明unique_lock具有和lock_guard一样的功能。unique_lock也可以同时锁定多个互斥体功能与scoped_lock一样。std::scoped_lock vs std::unique_lock 详细对比下面来看锁定两个互斥体的示例//unique_lock2.cpp unique_lock example //#include iostream // std::cout #include thread // std::thread #include mutex // std::mutex struct Box { explicit Box(int num) : num_things{ num } {} int num_things; std::mutex m; }; void transfer(Box from, Box to, int num) { // 仍未实际取锁 std::unique_lock lock1{ from.m, std::defer_lock }; std::unique_lock lock2{ to.m, std::defer_lock }; // 在不死锁的情况下锁定两个 unique_lock std::lock(lock1, lock2); from.num_things - num; to.num_things num; // 互斥体 “from.m” 和 “to.m” 会在 unique_lock 析构函数中解锁 } int main() { Box acc1(100); Box acc2(50); std::thread t1(transfer, std::ref(acc1), std::ref(acc2), 10); std::thread t2(transfer, std::ref(acc2), std::ref(acc1), 5); t1.join(); t2.join(); printf(acc1: %d\n, acc1.num_things); printf(acc2: %d\n, acc2.num_things); printf(hello learn unique_lock\n); return 0; }编译运行unique_lock不仅可以自动析构时解锁还可以随时unlock()/lock()例如//unique_lock3.cpp unique_lock example随时 unlock() / lock() //#include iostream // std::cout #include thread // std::thread #include mutex // std::mutex #include vector int main() { int counter 0; std::mutex counter_mutex; std::vectorstd::thread threads; //1.记录开始时间点 auto start std::chrono::steady_clock::now(); auto worker_task [](int id) { std::unique_lockstd::mutex lock(counter_mutex); //锁定 counter; printf(%d , 内部计数器: %d\n, id, counter); lock.unlock(); //解锁 // 我们模拟昂贵操作时不保有锁 std::this_thread::sleep_for(std::chrono::seconds(1)); lock.lock(); //锁定 counter; printf(%d , 最终计数器: %d\n, id, counter); //离开作用域自动解锁 }; for (int i 0; i 10; i) threads.emplace_back(worker_task, i); for (auto thread : threads) thread.join(); //2.记录结束时间点 auto end std::chrono::steady_clock::now(); //3.计算时间差 auto elapsed end - start; printf(耗时: %lld 纳秒\n, std::chrono::duration_caststd::chrono::nanoseconds(elapsed).count()); printf(耗时: %lld 微秒\n, std::chrono::duration_caststd::chrono::microseconds(elapsed).count()); printf(耗时: %lld 毫秒\n, std::chrono::duration_caststd::chrono::milliseconds(elapsed).count()); printf(耗时: %lld 秒\n, std::chrono::duration_caststd::chrono::seconds(elapsed).count()); printf(hello learn unique_lock\n); return 0; } //system_clock vs steady_clock //测量耗时请务必使用 steady_clock它保证只向前走不会被系统时间修改如NTP校时影响。 //不要用 system_clock 测耗时因为用户或系统可能修改系统时间导致测出负数或巨大偏差。system_clock 更适合用来获取日历时间显示给用户看编译运行注释掉第20行 lock.unlock(); //解锁第25行lock.lock(); //锁定再次编译运行说明unique_lock功能更强。参考https://zh.cppreference.com/cpp/thread/unique_lock【C】std::unique_lock 详解灵活的RAII锁管理工具_std::uniquelock-CSDN博客
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

数学建模竞赛全流程拆解:从模型选型到论文写作的实战指南 2026/9/1 2:17:16

数学建模竞赛全流程拆解:从模型选型到论文写作的实战指南

简介:这是一套面向数学类专业本科生的《数学软件与实验》课程配套资源,既包含课堂教学PPT,也覆盖考试复习、软件操作与课程分析等多个环节,适合正在修读该课程或希望提升数学建模与MATLAB应用能力的学生使用。压缩包内共115个文件…

阅读更多 →
AI应用丝滑体验的工程密码:Agent链路核心模块拆解与实战 2026/9/1 2:17:16

AI应用丝滑体验的工程密码:Agent链路核心模块拆解与实战

如果只是站在用户视角,很容易把“丝滑”理解成“界面流畅、按钮跟手、动画顺滑”。但如果你是做 AI 应用或 AI Agent 的开发者,就会知道,产品经理口中的“丝滑”往往不是动效,而是一整套工程链路的结果。用户看到的是一问一答、边…

阅读更多 →
Android端DWG解析:libredwg交叉编译与JNI封装实战 2026/9/1 2:17:16

Android端DWG解析:libredwg交叉编译与JNI封装实战

简介:本资源是一个基于 Android Studio 的 libredwg 库交叉编译工程,面向 Android 开发者及嵌入式 C/C 工程师,解决在安卓平台解析 DWG 文件的核心需求——无需从零配置 NDK 与 CMake 工具链,即可快速生成适配 arm64-v8a、armeabi…

阅读更多 →
氢能安全监测:无源光纤DTS/DAS技术原理与工程实践指南 2026/9/1 2:17:16

氢能安全监测:无源光纤DTS/DAS技术原理与工程实践指南

1. 这篇文章真正要解决的问题当我们在谈论氢能安全时,我们到底在担心什么?是储罐的泄漏,还是管道的腐蚀?这些当然是核心风险,但有一个更隐蔽、更致命的“杀手”常常被忽视:局部高温与外力破坏。在氢气生产、…

阅读更多 →
AI算力即电力:从功率评估到数据中心能效优化的工程实践 2026/9/1 2:17:15

AI算力即电力:从功率评估到数据中心能效优化的工程实践

如果你最近在本地跑过大模型,或者帮团队部署过 AI 推理服务,大概率遇到过这种情况:显卡驱动装好了,模型也下载完了,训练脚本跑起来的一瞬间,机房或办公位的电表跳了闸,或者服务器电源直接告警。…

阅读更多 →
PID控制算法从原理到实践:仿真、调参与工程排错指南 2026/9/1 2:14:15

PID控制算法从原理到实践:仿真、调参与工程排错指南

很多做嵌入式、电机控制、自动化项目的开发者,第一次接触 PID 时,往往不是被公式难倒,而是被“调参”这件事困住。明明书上写了 Kp、Ki、Kd 三个系数,但实际调的时候,不是超调大到系统震荡,就是响应慢得像蜗…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞