首页 > 其他分享 >std::unique_lock<std::mutex> 硬核理解

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

时间:2024-12-04 17:55:06浏览次数:3  
标签:std include lock num 线程 unique 硬核

通过数数1-100 来感受std::unique_lockstd::mutex的作用
如果没有std::unique_lockstd::mutex,各个线程对num的++是乱的,不能保证正确的顺序,可能存在同时对num进行添加
使用了std::unique_lockstd::mutex 保存使用num的时候,只有一个线程在使用,当释放了锁以后,其他的线程才可以使用
使用方法注释 std::unique_lockstd::mutex lock(mtx); 这一句,来感受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;
};

标签:std,include,lock,num,线程,unique,硬核
From: https://www.cnblogs.com/tlink/p/18586875

相关文章

  • 无需登录!简洁好用的远程桌面软件RustDesk
    前言RustDesk一款开源的远程工具,支持免安装,开箱即用,支持Windows,Macos,Linux,Android多个操作系统,安装包大小只有12M左右,无需任何配置,打开就可以直接使用,体验目前看来相当不错,支持自建服务器,已达到更快的速度。  安装环境[名称]:RustDesk[大小]:29MB[版本]:1.3.3[语言]:简......
  • 一款简洁好用的远程桌面软件RustDesk1.3.3
    点击上方蓝字关注我前言RustDesk一款开源的远程工具,支持免安装,开箱即用,支持Windows,Macos,Linux,Android多个操作系统,安装包大小只有12M左右,无需任何配置,打开就可以直接使用,体验目前看来相当不错,支持自建服务器,已达到更快的速度。全新的RustDesk可自动适应可用带宽,一键无人值守访......
  • AtomicBoolean与ReentrantLock
    AtomicBoolean主要用来解决并发编程中的线程安全问题,防止某段代码重复执行或确保某项任务只能执行一次。代码中常用来作为一个标志变量,以控制并发流程。AtomicBoolean体现的是一种无锁机制,依靠底层的高效的CAS原子操作实现,提供高效的线程安全操作。CAS简介CAS的核心思想是'比较......
  • C++11 std::function与std::bind
    std::function与std::bind std::functionstd::function是一个可调用对象包装器,是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟它们的执行。例如//普通函数intadd(inta,intb){returna......
  • Lock接口
    目录Lock接口概述API方法锁获取与中断Synchronized和Lock的区别大佬地址:AQS(AbstractQueuedSynchronizer)源码深度解析(2)—Lock接口以及自定义锁的实现Lock接口概述Lock接口同样自于JDK1.5,它被描述成JUC中的锁的超级接口,所有的JUC中的锁都会实现Lock接口。由于它是作为接......
  • C++中的std::function
    std::function()是C++标准库中的一个通用多态函数包装器,它可以存储,复制和调用任意可调用目标(函数,lambda表达式,绑定表达式或其他函数对象).std::function占用固定尺寸的内存.它允许我们将可调用对象(函数,函数指针,Lambda表达式等)包装成一个对象,使得我们可以像操作其他对......
  • 从挑战到突破:HBlock定义智算存储新范式!
    近日,由DOIT传媒主办,中国计算机学会信息存储专委会、武汉光电国家研究中心、百易存储研究院支持的2024中国数据与存储峰会在北京召开。此次峰会以“智数据AI未来”为主题,天翼云科技有限公司国际业务事业部存储产品线专家肖夏敏代表参会,并发表“轻量级存储集群控制器HBlock在智算时......
  • 【转】Bitlocker密钥丢失后的一些思路
    可能的恢复方案(按优先级排序):1.检查系统还原点  -查看是否有重装系统前的还原点  -路径:控制面板->系统和安全->文件历史记录  -如果找到,可尝试恢复加密证书2.搜索证书备份  -检查是否有.pfx或.cer格式的证书备份  -常见位置:   *桌面   *文......
  • 多线程篇-7--线程通信(等待/通知机制,等待/超时机制,CountdownLatch,CyclicBarrier,Blockin
    1、线程为什么要通信?多线程的目的是多条线程执行不同的逻辑业务从而能够提升业务整体的响应速度,如果线程都是孤零零的执行,不同的逻辑业务就不能最终汇聚成一个完整的业务,那么多线程也就失去了意义,这就是为什么要有线程间通信的存在。线程间的通信可以是主、子线程通信,也可......
  • MATLAB中listdlg函数用法
    目录语法说明示例显示颜色列表用于进行多选显示当前文件夹文件用于进行单选        listdlg函数的功是创建列表选择对话框。语法[indx,tf]=listdlg('ListString',list)[indx,tf]=listdlg('ListString',list,Name,Value)说明[indx,tf]=listdlg('List......