728x90
반응형
std::mutex의 lock()의 경우 lock을 호출한 함수에서 unlock을 호출하지 않고 또다시 lock을 호출하면 알 수 없는 동작을 하게 된다고 한다. 예를 들면 아래와 같다.
class buffer {
list<int> queue;
std::mutex mut;
public:
bool empty() {
std::lock_guard<std::mutex> lock(mut);
return queue.empty();
}
// 생략
int pop() throw(out_of_range) {
std::lock_guard <std::mutex> lock(mut);
while (empty())
{
// 생략
}
int tmp = queue.front();
queue.pop_front();
return tmp;
}
};
buffer 클래스에서 pop() 함수를 호출하면 mutex로 lock을 건 후, empty() 함수를 호출하는데 해당 경우에도 mutex를 사용하여 lock을 건다. 이런 경우에는 dead lock이 발생할 수 있다. 이 문제를 풀기 위해서 필요한 것이 recursive_mutex다.
recursive_mutex의 경우 lock을 건 후 또 다시 lock을 걸어도 괜찮다. 단 lock을 건 횟수만큼 unlock을 해야 한다.
std::mutex와 std::recursive_mutex의 사용 방법은 같다.
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
[C++] thread_local (0) | 2021.10.07 |
---|---|
[C++] error LNK2001: unresolved external symbol (Static member) (0) | 2021.10.07 |
[C++] result_of (0) | 2021.10.06 |
[C++] Callable (0) | 2021.10.06 |
[C++] condition_variable (2) | 2021.10.05 |