std::unique_lock<std::mutex> 硬核理解

通过数数1-100感受std::unique_lockstd::mutex的作用

在多线程编程中,如果没有适当的同步机制,多个线程同时访问和修改共享资源会导致数据竞争和不确定性。以一个简单的数数程序为例,如果多个线程同时对一个全局变量num进行自增操作(即++num),而没有采取任何同步措施,那么最终的计数结果很可能是混乱的,无法保证正确的顺序。

具体来说,在没有std::unique_lockstd::mutex的情况下,多个线程可能会同时读取num的值,并在其基础上进行自增,从而导致多个线程可能基于相同的num值进行计算,最终造成计数结果的缺失或重复。

为了解决这个问题,我们可以使用std::unique_lockstd::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;
};

posted @   Tlink  阅读(221)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示