C++ 스레드와 뮤텍스 (recursive_mutext), 데드락 방지
07 Apr 2020 | c++ programming effectiveC++에서 스레드를 만드는 방법은 다음과 같다.
C++의 람다를 사용하여 5개의 스레드를 만든다.
#include <thread> using namespace std; auto main() -> int { thread threads[5]; for(int i=0; i<5; i++) { threads[i] = thread([]() { cout << Thread ID: << this_thread::get_id() << endl; }) } }
멀티스레드 프로그래밍을 하다보면 동시성 문제 (데드락) 가 생길 수 있다.
lock을 사용하면 unlock을 걸어줘야 하지만 lock_guard를 사용하면 함수 스코프를 빠져나갈 때 락을 해제한다.
보통 공유자원을 mutext를 사용하여 보호하지만, 만약 mutex를 하나만 사용한다면 데드락 상황이 생길 수 있다. 이때 recursive_mutext를 사용하여 여러번 락을 거는것이 가능하다.
#include <thread> #include <mutex> #include <iostream> using namespace std; struct Math { recursive_mutext mtx; int m_content; Math() : m_content(1) {} void Multiplexer(int i) { lock_guard<recursive_mutex> lock(mtx); m_content *= i; } void Divisor(int i) { lock_guard<recursive_mutex> lock(mtx); m_content /= i; } void RunAll(int a) { lock_guard<recursive_mutex> lock(mtx); Multiplexer(a); Divisor(a); } }; auto main() -> int { Math math; math.RunAll(10); return 0; }
출처 : 모던C++로 배오는 함수형 프로그래밍