멀티 스레드 환경에서 공유자원에 대한 접근제어를 위해 뮤텍스를 사용한다. 뮤텍스는 반드시 lock - unlock 짝으로 사용 되어야한다.
그러나 짝으로 사용 되어도 개발자의 실수로 인해(조기 리턴 등) 문제를 일으킬 수 있다. 이러한 귀찮은 문제들을 한번에 해결해주는 것이 바로 lock_guard 클래스이다.
lock_guard는 RAII 스타일로 구현되어 있기 때문에 자원이 할당 되면 mutex 객체를 이용하여 lock을 하고 블록을 벗어나면 자원이 해제 되면서 unlock을 한다.
Defined in header <mutex> | ||
template< class Mutex > class lock_guard; |
Ex)
int sum = 0;
mutex mtx_lock;
void func1(int val){
for(int i=0;i<val;i++){
std::lock_guard<std::mutex> guard(mtx_lock);
cout<<"1"<<" i:"<<i<<endl;
sum+=i;
}
}
void func2(int val){
for(int i=0;i<val;i++){
std::lock_guard<std::mutex> guard(mtx_lock);
cout<<"2"<<" i:"<<i<<endl;
sum+=i;
}
}
void func3(int val){
for(int i=0;i<val;i++){
std::lock_guard<std::mutex> guard(mtx_lock);
cout<<"3"<<" i:"<<i<<endl;
sum+=i;
}
}
void func4(int val){
for(int i=0;i<val;i++){
std::lock_guard<std::mutex> guard(mtx_lock);
cout<<"4"<<" i:"<<i<<endl;
sum+=i;
}
}
int main(void){
cout<<"Start Program"<<endl;
thread t1(&func1,10);
thread t2(&func2,10);
thread t3(&func3,10);
thread t4(&func4,10);
t1.join();
t2.join();
t3.join();
t4.join();
cout<<"End Program : "<<sum<<endl;
return 0;
}
실행결과
Start Program
2 i:0
1 i:0
3 i:0
4 i:0
2 i:1
1 i:1
3 i:1
4 i:1
2 i:2
1 i:2
3 i:2
4 i:2
2 i:3
1 i:3
3 i:3
4 i:3
2 i:4
1 i:4
3 i:4
4 i:4
2 i:5
1 i:5
3 i:5
4 i:5
2 i:6
1 i:6
3 i:6
4 i:6
2 i:7
1 i:7
3 i:7
4 i:7
2 i:8
1 i:8
3 i:8
4 i:8
2 i:9
1 i:9
3 i:9
4 i:9
End Program : 180
'C and C++' 카테고리의 다른 글
[C++] 클래스를 캡슐화(Encapsulation) 하는 이유(왜 멤버변수는 대부분 private인가?) (1) | 2018.07.18 |
---|---|
[C++] 객체의 값을 전달할때 복사 비용을 줄이는 방법 "상수객체 참조자" (0) | 2018.07.10 |
[C++] 자원관리 Smart Pointer (shared_ptr) (0) | 2018.06.17 |
[C++] 상속을 허용하는 Base 클래스의 소멸자는 반드시 가상(virtual) 소멸자로 선언 (0) | 2018.06.03 |
[C++] 기본으로 만들어지는 생성자,복사 생성자, 소멸자, 대입 연산자와 이를 금지하는 방법 (0) | 2018.05.26 |