一、mutex
mutex 需要手动
1、mutex 类(互斥量):创建mutex类的对像
1.1,通过调用lock函数进行加锁 (在读就不能写,在写就不能读)
1.2,通过调用unlock进行解锁
注意点:lock必须与unlock成对出现
如下:
void makeFriend()
{
for (int i = 0; i < 1000; i++)
{
m_mutex.lock(); //手动加锁
printf("谈女朋友\n");
mm.push_back(i);
m_mutex.unlock(); //手动解锁
}
}
void breakUp()
{
for (int i = 0; i < 1000; i++)
{
if (!mm.empty())
{
m_mutex.lock(); //手动加锁
printf("和女朋友分手%d\n", mm.back());
mm.pop_back();
m_mutex.unlock(); //手动解锁
}
else
{
printf("海王变单身狗\n");
}
}
}
二、lock_guard
lock_guard 自动
1,lock_guard 对像实现加锁
1.1,在locK_guard类的构造函数中用lock函数
1.2,lock_gurad类的折构函数调用了unloc函数
如下:
void makeFriend()
{
lock_guard<mutex> lgObject(m_mutex); //自动加锁和解锁
for (int i = 0; i < 1000; i++)
{
printf("谈女朋友\n");
mm.push_back(i);
}
}
void breakUp()
{
lock_guard<mutex> lgObject(m_mutex); //自动加锁和解锁
for (int i = 0; i < 1000; i++)
{
if (!mm.empty())
{
printf("和女朋友分手%d\n", mm.back());
mm.pop_back();
}
else
{
printf("海王变单身狗\n");
}
}
}
三、完整案例
#include<thread>
#include<iostream>
#include<list>
#include<string>
#include<cstdio>
#include<mutex>
using namespace std;
using namespace this_thread;
class SeaKing
{
public:
void makeFriend()
{
lock_guard<mutex> lgObject(m_mutex); //自动加锁和解锁
for (int i = 0; i < 1000; i++)
{
//m_mutex.lock(); //手动加锁
printf("谈女朋友\n");
mm.push_back(i);
// m_mutex.unlock(); //手动解锁
}
}
void breakUp()
{
lock_guard<mutex> lgObject(m_mutex); //自动加锁和解锁
for (int i = 0; i < 1000; i++)
{
if (!mm.empty())
{
//m_mutex.lock(); //手动加锁
printf("和女朋友分手%d\n", mm.back());
mm.pop_back();
//m_mutex.unlock(); //手动解锁
}
else
{
printf("海王变单身狗\n");
}
}
}
protected:
list<int> mm;
mutex m_mutex; //互斥量
};
int main()
{
SeaKing mm;
thread t1(&SeaKing::makeFriend, &mm);
thread t2(&SeaKing::breakUp, &mm);
t1.join();
t2.join();
return 0;
}