C++多线程学习(六、互斥锁Mutex,lock,unlock,lock_guard函数)

目录

mutex类

lock和unlock函数

lock_guard函数


mutex类

(互斥量)创建mutex类的对象

1、通过调用1ock函数进行加锁

2、通过调用unlock进行解锁注意点:lock必须与unlock出现

lock和unlock函数

#include<iostream>
#include<list>
#include<thread>
#include<mutex>
using namespace std;
class SeaKing
{
public:
	void MakeFriend()
	{
		for (int i = 0; i < 10000; i++)
		{
			M_Lock.lock();//加锁
			printf("多一个朋友:%d\n",i);
			Girl.push_back(i);
			M_Lock.unlock();//解锁
		}
	}
	void EndFriend()
	{
		for (int i = 0; i < 10000; i++)
		{
			if (!Girl.empty())
			{
				M_Lock.lock();//加锁
				printf("减少一个朋友:%d\n",i);
				Girl.pop_back();
				M_Lock.unlock();//解锁
			}
			else
			{
				printf("Nofriend\n");
			}	
		}
	}
private:
	list<int> Girl;
	mutex M_Lock;//互斥量
};

int main()
{
	SeaKing King;
	thread t1(&SeaKing::MakeFriend, &King);
	thread t2(&SeaKing::EndFriend, &King);
	t1.join();
	t2.join();


	return 0;
}

lock_guard函数

lock_guard类的构造函数中调用lock函数

lock_gurad类的析构函数调用了unlock函数

类似于一个自动的锁,不能做拷贝也不能做构造,相当稳定。

#include<iostream>
#include<list>
#include<thread>
#include<mutex>
using namespace std;
class SeaKing
{
public:
	void MakeFriend()
	{
		lock_guard<mutex> LJObject(M_Lock);
		for (int i = 0; i < 10000; i++)
		{
			printf("多一个朋友:%d\n",i);
			Girl.push_back(i);
		}
	}
	void EndFriend()
	{
		for (int i = 0; i < 10000; i++)
		{
			if (!Girl.empty())
			{
				lock_guard<mutex> LJObject(M_Lock);
				printf("减少一个朋友:%d\n",i);
				Girl.pop_back();
			}
			else
			{
				printf("Nofriend\n");
			}	
		}
	}
private:
	list<int> Girl;
	mutex M_Lock;//互斥量
};

int main()
{
	SeaKing King;
	thread t1(&SeaKing::MakeFriend, &King);
	thread t2(&SeaKing::EndFriend, &King);
	t1.join();
	t2.join();


	return 0;
}

猜你喜欢

转载自blog.csdn.net/q244645787/article/details/131573744