728x90
반응형

Mutex 3

[C++] unique_lock, lock_guard

unique_lock과 lock_guard의 차이점은 lock을 걸 수 있는 시점이다. 둘 다 소멸 시점에 lock이 걸려 있다면 unlock을 수행한다. lock_guarud는 lock과 unlock 사이에서 lock과 unlock을 할 수 없지만 unique_lock은 소멸하기 전에 unlock과 lock을 걸 수 있다. unique_lock은 lock_guard에 기능이 추가된 버전이라고 생각하면 된다. 이러한 lock 유틸리티 객체를 사용하는 것은 프로그래머가 unlock 코드에 신경 쓰지 않아도 되게 해 준다. 아래와 같이 사용하면 된다. std::mutex m_mutex; std::lock_guard lock(m_mutex); std::unique_lock lock(m_mutex);

[C++] recursive_mutex

std::mutex의 lock()의 경우 lock을 호출한 함수에서 unlock을 호출하지 않고 또다시 lock을 호출하면 알 수 없는 동작을 하게 된다고 한다. 예를 들면 아래와 같다. class buffer { list queue; std::mutex mut; public: bool empty() { std::lock_guard lock(mut); return queue.empty(); } // 생략 int pop() throw(out_of_range) { std::lock_guard lock(mut); while (empty()) { // 생략 } int tmp = queue.front(); queue.pop_front(); return tmp; } }; buffer 클래스에서 pop() 함수를 호..

[C++] condition_variable

thread를 수행할 때 때로는 다른 thread의 작업을 기다려야 할 때가 있다. 이때 condition_varialbe을 사용하면 thread를 block 할 수 있다. block 조건은 timeout을 설정할 수 도 다른 thread를 통해 설정할 수도 있다. condition_variable은 다음과 같은 method를 제공한다. notify_one : 해당 조건 변수를 기다리고 있는 thread 중 한 개의 thread를 깨운다. notify_all : 해당 조건 변수를 기다리고 있는 모든 thread를 깨운다. thread는 상기 method 이외에 timeout에 의해서 깨어날 수도 있다. #include #include #include using namespace std; mutex g_m..

728x90
반응형