C++新特性32_C++中mutex与lock_guard的使用(采用上篇类似方法封装至C++的标准库中,C++从语法上实现了跨平台)

接上篇C++新特性31_利用C++自己封装线程同步锁(利用类的构造析构实现加锁解锁的自动化、利用引用实现在一个类中对另一个类的唯一对象的调用方法、利用对象及局部变量的作用域减小颗粒度),上篇介绍了自己利用C++完成线程同步锁的封装,C++11中STL采用和上篇一样的方式对上锁和解锁进行了封装,本篇看C++11中STL提供了怎样的锁机制?

1. C++提供的std::mutex上锁机制

类似于上篇我们自己利用C++将临界区方法进行封装,在C++标准库中也对相关的Windows API进行了封装即std::mutex

#include <tchar.h>
#include <iostream>
#include <thread>
#include <mutex>
#include <windows.h>
#include "CMyMutex.h"

using namespace std;

int g_nData = 0;
// 创建临界区对象,等价于锁
std::mutex g_mtx;	

void foo() {

	{

		g_mtx.lock();
		for (int i = 0; i < 100000; i++) {

			g_nData++;
		}
		g_mtx.unlock();
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	std::thread t(foo);
	
	{

		g_mtx.lock();
		for (int i = 0; i < 100000; i++) {
			g_nData++;
		}

		g_mtx.unlock();
	}

	t.join();

	std::cout << g_nData << std::endl;

	return 0;
}

运行结果:
在这里插入图片描述

2. C++提供的std::lock_guard自动上锁解锁机制

担心意外忘记解锁,为了实现上锁解锁的自动化,C++的标准库采用上篇相同的操作利用std::lock_guard<mutex>实现

#include <tchar.h>
#include <iostream>
#include <thread>
#include <mutex>
#include <windows.h>
#include "CMyMutex.h"

using namespace std;

int g_nData = 0;
// 创建临界区对象,等价于锁
std::mutex g_mtx;	

void foo() {

	{

		std::lock_guard<mutex> lg(g_mtx);
		for (int i = 0; i < 100000; i++) {

			g_nData++;
		}

	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	std::thread t(foo);
	
	{
		std::lock_guard<mutex> lg(g_mtx);

		for (int i = 0; i < 100000; i++) {
			g_nData++;
		}

	}

	t.join();

	std::cout << g_nData << std::endl;

	return 0;
}

在这里插入图片描述

之前C++11写法是固定windows操作系统,但是C++从语法上实现了跨平台,在不同的系统中会自动调用相应的API实现线程的加锁解锁操作。

3.学习视频: C++中mutex与lock_guard的使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值