[C++] Lock 하는 방법

수민·2023년 8월 23일
0

게임서버 이론

목록 보기
5/6
post-thumbnail

인프런 강의 를 듣고, 개인 공부 목적으로 정리한 글입니다.
문제 시 댓글이나 메일 주시면 감사하겠습니다.


Lock하는 방법

1. 일반 수동 Mutex

int sum = 0;
mutex m;
for (int i =0 ; i < 100 ; i++)
{
	m.lock();
	sum++;
    
    if (i == 50) {
    	m.unlock();
        break;
    }
    
    m.unlock();
}

정말 간단하긴 하나,
함수가 복잡해질 수록 처리하기도, 알아보기도 어렵고
문제 발생 확률이 높으며 추천하지 않는 방법이다.


2. LockGuard

LockGuard는 생성자에서 lock을, 소멸자에서 unlock을 담당해서 해준다!
범위 내에서 unlock 걱정할 필요 없이 lock을 걸어줄 수 있다는게 장점이다.

std에 있는데,
내부적인 구현은 아래와 같은 느낌이다.

template<typename T>
class LockGuard
{
public:
	LockGuard(T& m) {
		_mutex = &m;
		_mutex->lock();
	}

	~LockGuard()
	{
		_mutex->unlock();
	}
private:
	T* _mutex;
};

무느알 ??

약간 스마트포인터 느낌 ~
왠줄알아?

RAII 패턴을 이용하는 거다.

RAII 패턴

스택에 올라간 메모리는 유효범위를 넘어가면 자동으로 해제되는 것을 이용한 디자인 패턴

스마트포인터에도 적용되는 방법인데,
메모리 누수를 막기 위해 아주 좋은 방법이다..
스택에 올라간 메모리가 소멸되면서 자동으로 소멸자를 부르는데, 여기 소멸자에다가 내가 해줘야 하는 꼭 필요한 일들을 넣어주면 아주 깔끔하고 문제 없이 해결 할 수 있다.

이렇게 RAII 패턴을 이용해서, unlock을 하지 않아 프로그램이 영영 끝나지 않는 .. 문제를 해결할 수 있다 !

adopt_lock

이거는 std::lock_guard를 사용할 때,
매개변수에 넣는 태그이다.

	lock_guard<mutex> g1(m1, adopt_lock);

adopt_lock을 뒤에 넣어주면,
이미 m1은 lock 해놓은 상태니까, 나중에 소멸될 때 풀어주기만 해 ~ 라는 의미이다.


3. unique_lock

unique_lock<mutex> uniqueLock(m, defer_lock);
uniqueLock.lock();		

이렇게 사용할 수 있다.
얘도 mutex와 유사한 느낌인데,
생성자의 인자로 defer_lock을 넣어주면 나중에 별도로 lock을 걸 수 있다.


참고
https://m.blog.naver.com/kmc7468/220927032462

profile
우하하

0개의 댓글