1、描述
我们提供了一个类:
public class Foo {
public void first() { print(“first”); }
public void second() { print(“second”); }
public void third() { print(“third”); }
}
三个不同的线程 A、B、C 将会共用一个 Foo 实例。
一个将会调用 first() 方法
一个将会调用 second() 方法
还有一个将会调用 third() 方法
请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行。
来源:力扣(LeetCode)
链接:
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、关键字
顺序打印,多线程
3、思路
互斥锁
条件变量解法参考
4、notes
新知识点:
条件变量:
condition_variable cv;
mutex mtx;
int k = 0;
写在类里边;
5、复杂度
6、code
class Foo {
public:
condition_variable cv; // 条件变量
mutex mtx; // 锁
int k = 0;
Foo() { }
void first(function<void()> printFirst) {
printFirst();
k = 1;
cv.notify_all(); // 通知其他所有在等待唤醒队列中的线程
}
void second(function<void()> printSecond) {
unique_lock<mutex>lock(mtx);
cv.wait(lock, [this](){return k == 1;});
k = 2;
//cv.notify_all(); // 也行
cv.notify_one(); // 随机通知一个(unspecified)在等待唤醒队列中的线程
printSecond();
}
void third(function<void()> printThird) {
unique_lock<mutex>lock(mtx);
cv.wait(lock, [this](){return k == 2;});
printThird();
}
};