1114. 按序打印
Posted bugfly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1114. 按序打印相关的知识,希望对你有一定的参考价值。
// 我们提供了一个类: // 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; }
以上是关于1114. 按序打印的主要内容,如果未能解决你的问题,请参考以下文章