본문 바로가기

Algorithm/자료구조

(C++) - LeetCode (easy) 1114. Print in Order

반응형

https://leetcode.com/problems/print-in-order/

 

Print in Order - LeetCode

Can you solve this real interview question? Print in Order - Suppose we have a class: public class Foo { public void first() { print("first"); } public void second() { print("second"); } public void third() { print("third"); } } The same instance of Foo wi

leetcode.com

mutex와 condition_variable을 사용해 thread동작을 제어하는 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

class의 member 변수로 순서 order, mutex mtx, condition_variable cv를 선언해줍니다.

📔 풀이과정

unique_lock wrapper를 이용해 호출된 block을 lock해줍니다. 해당 block을 벗어나면 lock은 자동으로 해제되게 됩니다.

first second third순으로 lock이 풀리는 시점을 wait함수를 이용, order값을 확인해 순서를 제어해줍니다.

1. first함수의 경우 printFirst함수 수행후 order를 1증가 시킨 후 모든 thread에게 notify_all해줍니다.

2. second함수의 경우 order가 1이 될 때까지 기다렸다가 printSecond수행후 order 1증가해 모든 thread로 notify_all해줍니다.

3. third함수의 경우 order가 2가 될 때까지 기다렸다가 printThird를 수행합니다.

async로 임의의 thread에 해당 함수 수행을 배정받았더라도 lock과 wait으로 함수 호출 순서를 제어할 수 있게 됩니다.


📕 Code

📔 C++

#include <functional>
#include <mutex>
#include <condition_variable>

class Foo {
    int order;
    mutex mtx;
    condition_variable cv;
public:
    Foo() {
        order = 0;
    }

    void first(function<void()> printFirst) {
        unique_lock<mutex> lock(mtx);
        // printFirst() outputs "first". Do not change or remove this line.
        printFirst();
        order++;
        cv.notify_all();
    }

    void second(function<void()> printSecond) {
        unique_lock<mutex> lock(mtx);
        cv.wait(lock, [this]() {return order == 1;});
        // printSecond() outputs "second". Do not change or remove this line.
        printSecond();
        order++;
        cv.notify_all();
    }

    void third(function<void()> printThird) {
        unique_lock<mutex> lock(mtx);
        cv.wait(lock, [this]() {return order == 2;});
        // printThird() outputs "third". Do not change or remove this line.
        printThird();
    }
};

*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.