C and C++

[C++] RAII스타일로 동작하는 lock_guard

개발새발 2018. 6. 25. 22:08
반응형

멀티 스레드 환경에서 공유자원에 대한 접근제어를 위해 뮤텍스를 사용한다. 뮤텍스는 반드시 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


반응형