블로그
전체 3![[게임 서버 스터디] C++ 게임 서버 개발 스터디 3회차](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260) - 2021. 06. 23. - 0 - [게임 서버 스터디] C++ 게임 서버 개발 스터디 3회차 - 팀 명 게임 서버 스터디 스터디 진행 회차 및 일자 3회차 온라인 진행 스터디 후기 멀티 쓰레드 환경에서 개발을 진행하게 되면 데이터 영역과 힙 메모리 영역에 있는 값을 공유해서 사용하기 때문에 여러 쓰레드에서 사용하면 문제가 발생 할 수 있게 됩니다. `i++`과 같이 한 줄로 이루어진 연산이라 할 지라도 실제 어셈블리어로 보면 1) 메모리에서 레지스터로 값을 가지고 오고 2) 레지스터에 있는 값을 증가 시키고 3) 증가된 값을 다시 메모리에 저장 하는 총 3단계로 이뤄지기 때문입니다. 이런 문제를 해결하는 가장 쉬운 방법은 특정 데이터 타입을 atomic하게 만드는 것입니다. C++에서는 #include 헤더를 불러오고, atomic num = 0 과 같이 값을 선언하는 것으로 atomic한 데이터를 만들 수 있습니다. atomic한 데이터를 만들게 되면 위와 같이 어셈블리로 총 3단계로 나뉘던 작업을 원자 단위로 묶어 한 번에 작업을 진행 할 수 있게 만들어서 멀티 쓰레드 환경에서도 안전하게 값을 조작 할 수 있게 해줍니다. 단순한 값이 아니라 여러 연산을 안전하게 하고 싶다면, 이런 환경에서는 Lock을 사용해야 합니다. Lock을 사용하는 가장 일반적인 방법은 mutex란 것을 사용하는 것입니다. Lock을 사용하면 안전하게 멀티쓰레드를 사용 할 수 있지만, lock이 걸려 있는 부분은 싱글스레드처럼 동작을 하고 lock을 거는 순서에 따라서 데드락이 발생 할 수 있는 문제가 생깁니다. Lock을 사용 할 때 중요한 것 중 하나는 사용을 끝마치고 unlock을 해주는 것입니다. 하지만 매번 unlock을 해주는 것은 신경 쓰기 까다로운 작업이므로 C++의 생성자와 소멸자를 활용한 lock_guard를 사용하는 것이 lock을 관리하는 좋은 방법 중 하나입니다. 다음 시간에는 이러한 lock들을 직접 구현하는 방법에 대해 배워볼 예정입니다. 
![[게임 서버 스터디] C++ 게임 서버 개발 스터디 2회차](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260) - 2021. 06. 22. - 1 - [게임 서버 스터디] C++ 게임 서버 개발 스터디 2회차 - 팀 명 게임 서버 스터디 스터디 진행 회차 및 일자 2회차 온라인 진행 스터디 후기 지난 회차에 정한 커리큘럼을 바탕으로 오늘은 앞으로 강의를 듣기 위해 필요한 개발 환경을 세팅하고, 간단한 멀티스테드 개론에 대해서 공부를 했습니다. 이번 C++ 게임 서버 개발 강의에서는 IDE로는 Visual Studio 2019 버전을 사용하고, 1개의 Game 솔루션 아네 Client, Server, Core 총 3개의 패키지를 만드는 방식으로 세팅을 진행 했습니다. 다른 언어에 비해 C++과 관련된 프로젝트를 진행 할 때는 항상 세팅이 힘들고, 시간이 많이 드는 편이라고 생각을 합니다. 여러 솔루션에 있는 라이브러리와 파일들을 효율적으로 가져오고, 생성된 빌드를 Debug/Release에 맞춰서 저장하는 방식들을 세팅하면서 회사 온보딩 자료를 보면서 그저 따라만 했던 부분들을 이제 이해 할 수 있게 되었습니다. 세팅을 다 마친 후에는 기본적인 멀티쓰레드 개론에 대해서 공부를 했습니다. 우선 그 중에서 가장 기본이 되는 쓰레드란 무엇이고 쓰레드의 사용 방법에 대해서 배웠습니다. 쓰레드란 데이터 공간과 힙 메모리에 있는 값들을 공유하고, 고유한 스택 메모리를 가지고 있는 실행 단위입니다. 후에 `hardware_concurrency()`, `joinable()`, `join()` 등을 활용해서 안전하게 쓰레드를 사용하는 방법에 대해서 배울 수 있었습니다. 윈도우 기반의 수업을 듣고 있지만, 윈도운 전용 API가 아닌 C++ 표준에 들어온 기능들을 바탕으로 설명을 해주셔서 따라가는데 도움이 되었습니다. 
![[게임 서버 스터디] C++ 게임 서버 개발 스터디 1회차](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260) - 2021. 06. 20. - 2 - [게임 서버 스터디] C++ 게임 서버 개발 스터디 1회차 - 팀 명 게임 서버 스터디 스터디 진행 회차 및 일자 1회차 온라인 진행 스터디 후기 클라이언트 쪽 개발을 주로 진행을 해와서 항상 게임 서버에 대한 궁금증이 컸습니다. Unity 게임 개발 시리즈로 이미 한 번 강의를 내신 Rookiss님이 C++과 언리얼 쪽으로도 관련 강의를 찍으셨다고 하셔서 https://www.inflearn.com/course/%EC%96%B8%EB%A6%AC%EC%96%BC-3d-mmorpg-4 이 강의를 바탕으로 게임 서버에 대해 공부 해보기로 마음 먹었습니다. 아무래도 직장을 다니다 보니 혼자 강의를 듣다가는 포기할 가능성이 높아서, 스터디를 통해서 다른 분들과 함께 듣기로 했습니다. (https://www.inflearn.com/studies/233544) 1일차에는 스터디 전반적인 운영 방식과 커리큘럼 일정에 대해서 정했습니다. 스터디는 정해진 일정도안 커리큘럼에 있는 강의를 듣고, 해당 강의 들은 부분을 인증하는 방식으로 진행하기로 결정 했습니다. 커리큘럼은 다음과 같이 총 8회차에 걸쳐서 진행을 하기로 결정 했습니다. 1회차 : 섹션 0 OT + 섹션1 멀티쓰레드 프로그래밍 Future 까지 2회차 : 섹션1 나머지 3회차 : 섹션2 메모리 관리 4회차 : 섹션3 네트워크 프로그래밍 5회차 : 섹션4 네트워크 라이브러리 제작 6회차 : 섹션5 패킷 직렬화 7회차 : 섹션6 JobQueue 8회차 : 섹션7 데이터베이스 연동 앞으로 커리큘럼을 완주 할 수 있도록 스터디원들과 다함께 열심히 들어 보도록 하겠습니다. 




