[게임 서버 스터디] C++ 게임 서버 개발 스터디 3회차
팀 명
게임 서버 스터디
스터디 진행 회차 및 일자
3회차 온라인 진행
스터디 후기
멀티 쓰레드 환경에서 개발을 진행하게 되면 데이터 영역과 힙 메모리 영역에 있는 값을 공유해서 사용하기 때문에 여러 쓰레드에서 사용하면 문제가 발생 할 수 있게 됩니다.
`i++`과 같이 한 줄로 이루어진 연산이라 할 지라도 실제 어셈블리어로 보면 1) 메모리에서 레지스터로 값을 가지고 오고 2) 레지스터에 있는 값을 증가 시키고 3) 증가된 값을 다시 메모리에 저장 하는 총 3단계로 이뤄지기 때문입니다.
이런 문제를 해결하는 가장 쉬운 방법은 특정 데이터 타입을 atomic하게 만드는 것입니다.
C++에서는 #include <atomic> 헤더를 불러오고, atomic<int> num = 0 과 같이 값을 선언하는 것으로 atomic한 데이터를 만들 수 있습니다.
atomic한 데이터를 만들게 되면 위와 같이 어셈블리로 총 3단계로 나뉘던 작업을 원자 단위로 묶어 한 번에 작업을 진행 할 수 있게 만들어서 멀티 쓰레드 환경에서도 안전하게 값을 조작 할 수 있게 해줍니다.
단순한 값이 아니라 여러 연산을 안전하게 하고 싶다면, 이런 환경에서는 Lock을 사용해야 합니다.
Lock을 사용하는 가장 일반적인 방법은 mutex란 것을 사용하는 것입니다.
Lock을 사용하면 안전하게 멀티쓰레드를 사용 할 수 있지만, lock이 걸려 있는 부분은 싱글스레드처럼 동작을 하고 lock을 거는 순서에 따라서 데드락이 발생 할 수 있는 문제가 생깁니다.
Lock을 사용 할 때 중요한 것 중 하나는 사용을 끝마치고 unlock을 해주는 것입니다.
하지만 매번 unlock을 해주는 것은 신경 쓰기 까다로운 작업이므로 C++의 생성자와 소멸자를 활용한 lock_guard를 사용하는 것이 lock을 관리하는 좋은 방법 중 하나입니다.
다음 시간에는 이러한 lock들을 직접 구현하는 방법에 대해 배워볼 예정입니다.
댓글을 작성해보세요.
좋은 시간이었습니다.