Program Language/C & C++

[C++] condition_variable에서 unique_lock

야곰야곰+책벌레 2022. 5. 10. 09:46
728x90
반응형

thread 사이에 동기화를 할 때 lock을 잡는 것으로 가장 많이 사용되는 것은 lock_guard다. 소멸과 동시에 unlock을 해주기 때문에 자동으로 lock을 해제할 수 있기 때문이다. 편하지만 lock_guard는 오직 생성자, 소멸자를 통해서만 lock을 다룰 수 있다.

 

unique_lock은 lock_guard에 몇 가지 추가적인 기능이 있다. lock을 획득하는 시점을 미룰 수 있고 lock을 잡기 위해 무한 대기하지 않아도 된다. lock을 획득하는 순서를 보장해주기도 한다. unlock 함수도 호출할 수 있다. 

 

coditional_variable은 조건을 만족하지 않으면 무한 대기하지 않고 thread를 바로 block 한다. thread가 block 되면 다른 thread로 넘어가기 때문에 CPU를 낭비하지 않고 사용할 수 있다. wait()는 condition_variable이 깨우거나 조건을 만족할 때까지 대기한다. 깨어나면 lock을 획득하고 조건이 있으면 확인한다. 그렇기 때문에 unique_lock을 사용해야 한다.

 

conditional_variable의 wait() 함수는 unique_lock 객체를 하나만 넣어도 되고, 두 번째 인자에 조건을 넣어주면 해당 조건을 만족할 때만 lock을 잡는다.

unique_lock<mutex> lock(the_mutex);
cv.wait(lock, []() { return !q.empty(); });
// !q.empty()면 탈출

조건을 만족하면 락을 획득하고 코드를 진행하고, 만족하지 못하면 lock를 풀고 block 된다. notify가 호출되면 깨어난다.

728x90
반응형

'Program Language > C & C++' 카테고리의 다른 글

[C++] 파일 마지막에 문자 추가하기  (0) 2022.05.13
[C++] Queue Clear  (0) 2022.05.10
[C++] 문자 제거  (0) 2022.04.29
[C++] unique_ptr<T> nullptr 비교하기  (0) 2022.04.12
[C++] Algorithms and Lifting  (0) 2022.02.18