互斥量
互斥量是个类对象,使用 lock() 成员函数来加锁。
头文件
#include <mutex>
一般用法
lock()
...
unlock()
lock_guard
- 构造函数里面执行了 mutex::lock()
- 作用域结束时,析构函数执行 mutex::unlock()
{
lock_guard guard(my_mutex);
}
std::lock()
用于处理多个互斥量,所有互斥量都锁住才继续执行,否则会释放已经锁住的互斥量,防止死锁。
std::lock(mutex1, mutex2, ...);
std::lock_guard 的 std::adopt_lock 参数
adopt_guard 为结构体对象,作为标记,表示这个已经 lock。
std::lock_guard<std::mutex> my_guard(my_mutex,std::adopt_lock);
code
#include <iostream>
#include <thread>
#include <list>
#include <mutex>
using namespace std;
class A {
public:
void in_msg_queue() {
for (int i = 0; i < 20; ++i) {
cout << "insert item: " << i << endl;
{
//lock_guard<mutex> sbguard(my_mutex1, adopt_lock);
lock(my_mutex1, my_mutex2);
//my_mutex2.lock();
//my_mutex1.lock();
msg_queue.push_back(i);
my_mutex1.unlock();
my_mutex2.unlock();
}
}
}
bool out_msg_lul_queue() {
my_mutex1.lock();
my_mutex2.lock();
if (!msg_queue.empty()) {
cout << "delete item: " << msg_queue.front() << endl;
msg_queue.pop_front();
my_mutex2.unlock();
my_mutex1.unlock();
return true;
}
my_mutex2.unlock();
my_mutex1.unlock();
return false;
}
void out_msg_queue() {
for (int i = 0; i < 20; ++i) {
if (!out_msg_lul_queue()) {
cout << "empty" << endl;
}
}
}
private:
list<int> msg_queue;
mutex my_mutex1;
mutex my_mutex2;
};
int main() {
A a;
mutex my_mutex;
thread out_msg(&A::out_msg_queue, &a);
thread in_msg(&A::in_msg_queue, &a);
out_msg.join();
in_msg.join();
return 0;
}
(base) ~/Desktop$ ./main
emptyinsert item:
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
0
empty
insert item: 1
insert item: 2
insert item: 3
insert item: 4
insert item: 5
insert item: 6
insert item: 7
insert item: 8
insert item: 9
insert item: 10
insert item: 11
insert item: 12
insert item: 13
insert item: 14
insert item: 15
insert item: 16
insert item: 17
insert item: 18
insert item: 19
delete item: 0
delete item: 1
delete item: 2
delete item: 3
delete item: 4