// 我们提供了一个类:
// public
// class Foo {
// public void one() { print("one"); }
// public void two() { print("two"); }
// public void three() { print("three"); }
// } 三个不同的线程将会共用一个 Foo 实例。
// 线程 A 将会调用
// one() 方法 线程 B 将会调用 two() 方法 线程 C 将会调用
// three() 方法 请设计修改程序,以确保 two() 方法在 one()
// 方法之后被执行,three() 方法在 two() 方法之后被执行。
// 示例 1 :
// 输入 : [ 1, 2, 3 ] 输出 : "onetwothree" 解释
// : 有三个线程会被异步启动。 输入[1, 2, 3] 表示线程 A 将会调用
// one() 方法,线程 B 将会调用 two() 方法,线程 C 将会调用
// three() 方法。 正确的输出是 "onetwothree"。 示例 2 :
// 输入 : [ 1, 3, 2 ] 输出 : "onetwothree" 解释
// : 输入[1, 3, 2] 表示线程 A 将会调用 one() 方法,线程 B 将会调用
// three() 方法,线程 C 将会调用 two() 方法。 正确的输出是 "onetwothree"。
// 注意 :
// 尽管输入中的数字似乎暗示了顺序,但是我们并不保证线程在操作系统中的调度顺序。
// 你看到的输入格式主要是为了确保测试的全面性。 在真实的面试中遇到过这道题?
// 来源:力扣(LeetCode) 链接:https
// : // leetcode-cn.com/problems/print-in-order
// 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#include <condition_variable>
#include <functional>
#include <iostream>
#include <mutex>
#include <thread>
void p1() { std::cout << "one" << std::endl; }
void p2() { std::cout << "two" << std::endl; }
void p3() { std::cout << "three" << std::endl; }
class Foo {
public:
Foo() {}
void first(std::function<void()> printFirst) {
std::unique_lock<std::mutex> guard(mutex_);
// printFirst() outputs "first". Do not change or remove this line.
printFirst();
first_ = true;
cond_.notify_all();
}
void second(std::function<void()> printSecond) {
std::unique_lock<std::mutex> guard(mutex_);
while (!first_) {
cond_.wait(guard);
}
// printSecond() outputs "second". Do not change or remove this line.
printSecond();
second_ = true;
cond_.notify_all();
}
void third(std::function<void()> printThird) {
std::unique_lock<std::mutex> guard(mutex_);
while (!second_) {
cond_.wait(guard);
}
// printThird() outputs "third". Do not change or remove this line.
printThird();
}
private:
volatile bool first_ = false;
volatile bool second_ = false;
std::mutex mutex_;
std::condition_variable cond_;
};
int main() {
Foo fo;
std::thread th1(std::bind(&Foo::second, &fo, p2));
std::thread th2(std::bind(&Foo::first, &fo, p1));
std::thread th3(std::bind(&Foo::third, &fo, p3));
th1.join();
th2.join();
th3.join();
return 0;
}