1.有读有写
保护共享数据:互斥量(mutex)
std::mutex my_mutex
my_mutex.lock(); my_mutex.unlock();
或者使用std::lock_guard<std::mutex> my_lock(my_mutex);
使用lock_guard 在构造函数会调用mutex::lock(),析构函数调用 mutex::unlock();
为了使用lock_guard ,可以配合大括号使用
#include<iostream>
#include<thread>
#include<vector>
#include<list>
#include<mutex>
using namespace std;
class son_thread {
public:
int m_a;
public:
son_thread(int a):m_a(a) {
}
void product() {
for (int i = 0; i < 100000; i++) {
{ my_mutex.lock();
my_list.push_back(i);
cout << "插入元素:" << i << endl;
my_mutex.unlock();
}
}
return;
}
void consume() {
my_mutex.lock();
if (my_list.empty()) {
cout << "my_list为空" << endl;
}
else {
//std::lock_guard<std::mutex> my_guard(my_mutex);
int temp = my_list.front();
my_list.pop_front();
cout << "my_list:front()的头部元素" << temp << endl;
}
my_mutex.unlock();
return;
}
void continue_print() {
while (1) {
consume();
}
}
private:
list<int>my_list;
std::mutex my_mutex;
//lock_guard<mutex> my_guard;
};
int main() {
son_thread s1(1);
thread obj1(&son_thread::product, &s1);
thread obj2(&son_thread::continue_print, &s1);
obj1.join();
obj2.join();
return 0;
}
2.死锁
同时锁住两个锁。
lock(my_mutex1,my_mutex2);
std::lock_guard的std::adopt_lock参数
std::lock_guardstd::mutex my_guard(my_mutex,std::adopt_lock);
加入adopt_lock后,在调用lock_guard的构造函数时,不再进行lock();
adopt_guard为结构体对象,起一个标记作用,表示这个互斥量已经lock(),不需要在lock()。