50 C++ 多个线程共享资源问题fix方案二 ----- lock_guard类

这篇具有很好参考价值的文章主要介绍了50 C++ 多个线程共享资源问题fix方案二 ----- lock_guard类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前提:

在上一节中,我们使用了mutex的lock函数和unlock函数处理共享资源问题

这一节,我们学习使用 lock_guard来处理 共享资源问题。

lock_guard是啥?

是个类模版,这个类模版只能对mutex类型进行构造

例子:

lock_guard<mutex> mylock_guard(mymutex);

50 C++ 多个线程共享资源问题fix方案二 ----- lock_guard类,c++

lock_guard的优点:

优点类似于智能指针,

当我们实例化一个 lock_guard后,不需要unlock()

lock_guard<mutex> mylock_guard(mymutex);

lock_guard工作原理

lock_guard是个类,那么就有构造函数和析构函数。

lock_guard的构造函数里面 执行了 mutex::lock();

lock_guard的析构函数里面 指向了 mutex::unlock();

这也是lock_guard类只用 实例化出来,就不会unlock()的原因,因为当lock_guard 对象析构的时候,会自动的unlock();

这也意味着在实现时,要特别注意lock_guard 对象是什么时候析构的。必要的时候,可以用{}包装起来。

lock_guard 实例

改动代码如下:文章来源地址https://www.toymoban.com/news/detail-799064.html

class Teacher166 {

public:
	//共享数据 存在list中
	list<int> msgListQueue;
	mutex mymutex;
	int readcount = 0;//记录已经读取了多少个。
public:
	//读取 共享数据的线程方法
	void readfunc() {
		while (true) {
			//只要不为空,就可以读取数据
			if (readcount >= 2000) {
				break;
			}
			lock_guard<mutex> mylock_guard(mymutex);//mylock_guard在这里创建出来,在mylock_guard的构造函数中,就已经对mymutex进行了lock()操作,等到mylock_guard的生命周期结束后会析构,这时候会调用mymutex的unlock()函数
			if (!msgListQueue.empty()) {
				int readvalue = msgListQueue.front();//每次都读取第一个
				cout << "读取到的值为" << readvalue << " readcount = " << readcount << endl;
				msgListQueue.pop_front();//删除第一个元素
				readcount++;
			}
			else {
				cout << "没有读取到值" << endl;
			}
		}
	}

	//写入 共享数据的线程方法
	void writefunc() {
		for (size_t i = 0; i < 1000; i++)
		{
			lock_guard<mutex> mylock_guard(mymutex);//mylock_guard在这里创建出来,在mylock_guard的构造函数中,就已经对mymutex进行了lock()操作,等到mylock_guard的生命周期结束后会析构,这时候会调用mymutex的unlock()函数,实际上这里实例化对象 lock_guard<mutex> 不管名字是啥,只要里面参数是 mymutex就可以了,也就是说:只要是同一个 mutex
			msgListQueue.push_back(i);//每次都写到末尾
			cout << "写入元素的值为" << i << endl;
		}
	}

public:
	Teacher166() {
		cout << "Teacher166 构造方法 this = " << this << endl;
	}

	Teacher166(const Teacher166 & obj) {
		cout << "Teacher166 copy 构造方法 this = " << this << "  obj = " << &obj << endl;
	}

	~Teacher166() {
		cout << "Teacher166 析构函数 this = " << this << endl;
	}
};


void main() {

	cout << "=========================" << endl;

	Teacher166 tea1;

	thread readthread1(&Teacher166::readfunc, &tea1);
	thread writethread1(&Teacher166::writefunc, &tea1);
	//thread 的构造方法第二个参数 可以是地址,如果是地址,那么 readthread1 和 writethread1的传递就是同一个 teacher

	thread readthread2(&Teacher166::readfunc, &tea1);
	thread writethread2(&Teacher166::writefunc, &tea1);
	readthread1.join();
	readthread2.join();
	writethread1.join();
	writethread2.join();
}

到了这里,关于50 C++ 多个线程共享资源问题fix方案二 ----- lock_guard类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一百四十九、Kettle——Linux上安装的kettle8.2创建共享资源库时遇到的问题(持续更新中)

    在kettle8.2在Linux上安装好可以启动界面、并且可以连接MySQL、Hive、ClickHouse等数据库后开始创建共享资源库,但是遇到了一些问题 1、报错详情 2023/08/10 13:57:21 - Spoon - Caused by: java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons:  2023/08/10 13:57:21 - Spoon -     no swt-mozilla-gtk-4335 i

    2024年02月13日
    浏览(67)
  • nodejs中的共享资源和锁

    在Node.js中,如果你使用锁来同步代码,通常是为了防止多个线程或进程同时访问共享资源,这可能导致数据不一致或其他问题。然而,Node.js本身并不是一个多线程环境,而是单线程的。因此,你通常不会在Node.js中使用锁来同步线程,而是使用锁来同步异步操作。 如果你正在

    2024年01月22日
    浏览(40)
  • 云计算资源供应模型是指云计算所提供的资源供应方式,主要包括共享型资源和专属型资源。

    作者:禅与计算机程序设计艺术 云计算是一种将大数据、机器学习等技术应用到互联网的数据中心中,向用户提供更高级的计算服务的一种服务模式。其特点之一就是利用计算机硬件、网络和软件资源池作为计算基础设施(Infrastructure as a Service, IaaS)或平台服务(Platform as

    2024年02月06日
    浏览(43)
  • HTTP 第六章 跨资源共享(CORS)

    跨源资源共享(CORS,或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其他源(域、协议或端口),使得浏览器允许这些源访问加载自己的资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该

    2024年02月22日
    浏览(43)
  • 【开源】基于JAVA的教学资源共享平台

    基于JAVA+Vue+SpringBoot+MySQL的教学资源共享平台,包含了课程管理、课程课件、授课中心、作业发布、课程评价、课程质量分析、交流互动模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,教学资源

    2024年01月19日
    浏览(57)
  • 【开源】基于JAVA语言的教学资源共享平台

    基于JAVA+Vue+SpringBoot+MySQL的教学资源共享平台,包含了课程管理、课程课件、授课中心、作业发布、课程评价、课程质量分析、交流互动模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,教学资源

    2024年01月20日
    浏览(51)
  • D3D11和Vulkan共享资源 (一)

    很久以前研究过 用NV_DX_interop扩展让D3D和OpenGL共享资源 , OpenGL在当初设计的时候电脑和操作系统还是个相对比较简单的东西,因此OpenGL API设计没有考虑到现在计算机架构的一些特性,比如多核编程和多显卡并发。最近几年出来个Vulkan来接OpenGL的班,所以继续走起研究下D3D1

    2023年04月13日
    浏览(34)
  • CORS(跨域资源共享)源验证失败解决方法

    在web系统中,安全软件扫描经常会发现CORS(跨域资源共享)作为高危漏洞出现。本文提供用Nginx作为反向代理的解决方案。解决方式是在nginx.conf文件中做如下配置: 注意: 1、“xxxx.com\\\"是示例域名,按你实际用到的更改。如果有多个外部域名,则逐一按if方式处理。不建议用

    2024年02月15日
    浏览(44)
  • 【AI底层逻辑】——篇章7(下):计算资源&软件代码共享

    目录 续上篇... 三、计算资源 1、第一阶段:数据大集中 2、第二阶段:资源云化

    2024年02月10日
    浏览(50)
  • 局域网访问共享资源时提示不能访问网络位置的解决方法

    组建局域网之后,当然要实现局域网资源共享,但是有些时候,在局域网中访问共享资源时,系统提示“不能访问网络位置,有关网络排除故障的信息”,造成该问题的原因很多,请按本文所述的步骤一步一步检查设置,即可解决问题,下面是具体方法,希望对您有所帮助; 不

    2024年02月06日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包