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;
}

 

posted on 2019-09-26 20:22  bug睡的略爽  阅读(188)  评论(0编辑  收藏  举报

导航