lock_guard의 한계lock_guard를 사용한다 해서 모든 데드락 현상을 방지할 수는 없다 데드락서로 락을 하나씩 걸고상호 기다리는 상태와 같은 현상을 데드락이라고 한다데드락은 항상 발생하는 것이 아니라 랜덤확률로 발생하다 보니기존 디버깅으로 발생하지 않던 버그가 갑자기 발생하는 경우가 있어매우 곤란하다 데드락 예시 1// AccountManager.hclass Account{ // TODO};class AccountManager{public: static AccountManager* Instance() { static AccountManager instance; return &instance; } Account* GetAccount(int32 id) { lock_guard guard(_mu..
atomic vs. lock지난 시간에 배운 atomic보단이번 시간에 배울 lock을 사용하는 게 일반적이다 STL 자료구조와 멀티스레드 환경STL 자료구조는 멀티스레드 환경에서 각 상황에 따른 다양한 이유로 인해 정상적으로 동작하지 않는다 - 예시: 더블프리문제vector v;void Push(){ for (int32 i = 0; i 위의 코드를 실행하면, 크래시가 발생한다그 이유는 아래와 같다1번 스레드와 2번 스레드가 동시에 vector가 꽉 찬 걸 확인하고 1번이 새로운 동적배열을 만들고 복사하고 기존 동적배열은 삭제했는데 2번이 새로운 동적배열을 만들고 복사를 시도하려 하니 기존 배열이 이미 삭제된 버린 상황이 발생한다 - 해결?: reservevector v;void Push(){ for ..
공유 자원의 문제#include #include int32 sum = 0;void Add(){ for (int32 i = 0; i 위의 코드처럼두 스레드에 각각 더하기와 빼기를 실행시키면결과는 0이 아닌 이상한 값이 나온다 조금 더 정확하게 코드를 살펴보면사실 sum++ 코드는 사실 한 줄로 작성된 코드이지만실제로 어셈블리어를 확인해보면아래의 코드처럼사실 3단계의 과정으로 이루어져 있다sum++;// 실제 내부 동작int32 eax = sum;eax = eax + 1;sum = eax; 따라서 더하기와 빼기가 한 사이클 동작하는 예시를아래의 코드를 통해 알아보자int32 sum = 0;void Add(){ for (int32 i = 0; i 위의 코드 순서처럼 한 사이클이 동작한다면분명 Add가 한번 S..
식당 예시위의 그림처럼 식당과 비교해서프로그램의 흐름의 핵심은CPU 코어, 스레드, 프로세스로 구성이 된다 코어와 쓰레드코어는 일을 하는 전력과도 같다대부분의 컴퓨터는 멀티 코어이지만아래의 예시에서는 하나의 코어만 있다고 가정해 보자 여러 프로그램을 실행하는 경우에우선순위 및 작업량에 따라서 CPU가 스레드를 배치한다그리고 하나의 코어가 배치된 쓰레드를 번갈아가며 실행한다사실상 코어는 단 하나의 스레드만 실행을 하지만스레드의 전환 속도를 높이면 마치 여러 스레드를 동시에 실행하는 것처럼 동작한다그리고 이를 멀티스레드 환경이라고 부른다 스레드에 대한 고찰중요하지 않거나 작업량이 많지 않은 프로그램의 경우는하나의 스레드(단일 스레드)로 동작한다반면, 중요하고 작업량이 많은 프로그램의 경우는 여러 스레드를 배..
Server 솔루션 제작ServerCore: 서버 핵심 기능을 작성하는 lib 파일GameServer: 서버 로직DummyClient: 클라 로직 (연습용) lib vs. dll구분Static Library (lib)Dynamic Link Library (dll)링크 시점컴파일/링크 시점에 프로그램에 통합됨실행 시점에 프로그램과 동적으로 연결됨파일 크기실행 파일(exe)에 라이브러리가 포함되어 크기가 큼실행 파일은 작고, dll 파일은 별로도 존재메모리 사용각 실행 파일이 별도의 복사본을 가짐메모리를 공유해 여러 프로그램이 동일 dll 사용 가능수정 및 업데이트라이브러리를 수정하면, 다시 빌드 필요dll을 교체하면 재빌드 없이도 수정 가능배포단일 exe 파일로 배포 가능exe와 dll 파일 모두 배포 필..
서버다른 컴퓨터들에서 연결이 가능하도록대기 상태로 상시 실행 중인 프로그램을 의미한다 마치 영업 중인 식당과도 비슷하다손님을 받기 위해서 식당을 열고 대기 중인 상태를 유지하고손님이 오면 식당 메뉴/정책에 따라 서비스를 제공한다 게임 서버의 종류- Web Server (ex. HTTP Server)테이크아웃 포장 전문 식당과 유사하다드물게 정보를 요청/갱신한다실시간 Interaction이 필요하지 않다식당에서 손님한테 먼저 접근할 일은 없다손님이 음식을 받아서 떠나면, 그 이후론 연결이 끊긴다 (Stateless) - Game Server (ex. TCP Server, Binary Server, Stateful Server,...)일반적인 식당과 유사하다요청/갱신 횟수가 많다실시간 Interaction이..