std::unique_lock<std::mutex> 硬核理解
通过数数1-100感受std::unique_lock
与std::mutex
的作用
在多线程编程中,如果没有适当的同步机制,多个线程同时访问和修改共享资源会导致数据竞争和不确定性。以一个简单的数数程序为例,如果多个线程同时对一个全局变量num
进行自增操作(即++num
),而没有采取任何同步措施,那么最终的计数结果很可能是混乱的,无法保证正确的顺序。
具体来说,在没有std::unique_lock
和std::mutex
的情况下,多个线程可能会同时读取num
的值,并在其基础上进行自增,从而导致多个线程可能基于相同的num
值进行计算,最终造成计数结果的缺失或重复。
为了解决这个问题,我们可以使用std::unique_lock
和std::mutex
来确保对共享资源num
的访问是线程安全的。
std::mutex
是一个互斥锁,用于保护共享数据,防止多个线程同时访问。std::unique_lock
是一个与互斥锁相关的锁管理类,它提供了一种更灵活的方式来管理锁的生命周期和所有权。
#include <mutex>
#include <thread>
#include <iostream>
#include <string>
/// <summary>
/// 通过数数来感受std::unique_lock<std::mutex>的作用
/// 如果没有std::unique_lock<std::mutex>,数据各个线程对num的使用是乱的,不能保证正确的顺序,可能存在同时对num进行添加
/// 使用了std::unique_lock<std::mutex> 保存使用num的时候,只有一个线程在使用,当释放了锁以后,其他的线程才可以使用
/// </summary>
class TestMutex
{
public:
void increment(int times, int theadNo) {
for (int i = 0; i < times; ++i) {
std::unique_lock<std::mutex> lock(mtx); // 锁定互斥锁
++num; // 保护共享资源
// lock 会在离开作用域时自动解锁
std::cout << std::to_string(theadNo) << " num:" << num << "\n";
std::this_thread::sleep_for(std::chrono::microseconds(500));
}
}
void TestPrintThreadId()
{
const int increment_times = 50;
std::thread thread[2];
for (size_t i = 0; i < 2; i++)
{
thread[i] = std::thread(&TestMutex::increment, this, increment_times, i);
}
for (auto& c : thread)
{
c.join();
}
}
private:
std::mutex mtx;
int num = 0;
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现