반응형
https://leetcode.com/problems/print-in-order/
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();
}
};
*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.