lock_guard<mutex>
:当mutex
没上锁时,就会上锁;mutex
上锁时,会等待。超出作用域后会析构解锁。
class Foo {
public:
mutex lock1,lock2;
Foo() {
lock1.lock();
lock2.lock();
}
void first(function<void()> printFirst) {
// printFirst() outputs "first". Do not change or remove this line.
printFirst();
lock1.unlock();
}
void second(function<void()> printSecond) {
lock_guard<mutex> guard1(lock1);
// printSecond() outputs "second". Do not change or remove this line.
printSecond();
lock2.unlock();
}
void third(function<void()> printThird) {
lock_guard<mutex> guard2(lock2);
lock_guard<mutex> guard1(lock1);
// printThird() outputs "third". Do not change or remove this line.
printThird();
}
};
直接利用互斥变量
class Foo {
public:
pthread_mutex_t mutex1,mutex2;
Foo() {
pthread_mutex_init(&mutex1,nullptr);
pthread_mutex_init(&mutex2,nullptr);
pthread_mutex_lock(&mutex1);
pthread_mutex_lock(&mutex2);
}
void first(function<void()> printFirst) {
// printFirst() outputs "first". Do not change or remove this line.
printFirst();
pthread_mutex_unlock(&mutex1);
}
void second(function<void()> printSecond) {
pthread_mutex_lock(&mutex1);
// printSecond() outputs "second". Do not change or remove this line.
printSecond();
pthread_mutex_unlock(&mutex2);
}
void third(function<void()> printThird) {
pthread_mutex_lock(&mutex2);
// printThird() outputs "third". Do not change or remove this line.
printThird();
pthread_mutex_unlock(&mutex2);
}
};