std::lock_guard和std::mutex 的用法

std::lock_guard和std::mutex 的用法

功能介绍

二者均属于C++11的特性:

  • std::mutex属于C++11中对操作系统锁的最常用的一种封装,可以通过lock、unlock等接口实现对数据的锁定保护。

  • std::lock_guard是C++11提供的锁管理器,可以管理std::mutex,也可以管理其他常见类型的锁。

    std::lock_guard的对锁的管理属于RAII风格用法(Resource Acquisition Is Initialization),在构造函数中自动绑定它的互斥体并加锁,在析构函数中解锁,大大减少了死锁的风险。

代码示例

#include <iostream>
#include <mutex>
#include <thread>

int loop_cnt = 10000000;

class Widget
{
public:
	Widget() = default;
	~Widget() = default;

	void addCnt()
	{
		std::lock_guard<std::mutex> cLockGurad(lock_); //构造时加锁,析构时解锁

		// lock_.lock(); //不使用lock_guard时的写法
		cnt++;
		// lock_.unlock();//不使用lock_guard时的写法,万一没有解锁就会死锁。
	}

	int cnt = 0;

private:
	std::mutex lock_;
};

void ThreadMain1(Widget *pw)
{
	std::cout << "thread 1 begin." << "\n";
	for (int i = 0; i < loop_cnt; i++)
		pw->addCnt();
	std::cout << "thread 1 end."  << "\n";
}

void ThreadMain2(Widget *pw)
{
	std::cout << "thread 2 begin."  << "\n";
	for (int i = 0; i < loop_cnt; i++)
		pw->addCnt();
	std::cout << "thread 2 end."  << "\n";
}

int main()
{
	Widget *pw = new Widget();

	std::thread t1(&ThreadMain1, pw);
	std::thread t2(&ThreadMain2, pw);

	t1.join();
	t2.join();

	std::cout << "cnt =" << pw->cnt << std::endl;
	
	return 0;
}

原文链接: https://www.cnblogs.com/joyer/p/15668695.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    std::lock_guard和std::mutex 的用法

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/215521

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 上午2:51
下一篇 2023年2月13日 上午2:51

相关推荐