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++로 배오는 함수형 프로그래밍