Program Language/C & C++

[C++] recursive_mutex

야곰야곰+책벌레 2021. 10. 7. 09:29
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