게임 서버17 9. 소켓 프로그래밍 이번 강의는 소켓 프로그래밍에 대한 내용이다. 이 내용은 열혈 TCP/IP 책에서 숙지한 내용들과 겹치는 부분이 많아서 숙지하는데 어렵지 않았고 내용을 복기하고 디테일을 잡아가는 마음으로 공부했다. 서버/*소켓 초기화*/ WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) return 0;- WSADATA는 WSA + DATA이며, WSA는 Windows Socket API의 약자이다. - WSAStartup함수를 호출할 때 필요한 정보를 저장하고 전달하는데 사용되는 구조체다. SOCKET listenSocket = socket(AF_INET/*IPv4*/, SOCK_STREAM/*TCP 방식 사용*/, 0); if (listenSocket == IN.. 2023. 12. 11. 8. 스마트 포인터 스마트 포인터에 대한 내용이지만 결과적으로 스마트포인터의 동작이 멀티스레드 환경에서 어떻게 안전한지를 이해해야 하는 강의였다. 참조계수 관리 방식- 참조계수 관리 방식이란 현재 해당 포인터가 참조된 횟수를 관리해서 0인 경우 메모리를 삭제하는 방식이다. - 이 방식을 수동으로 관리하거나 자동으로 관리할 수 있는데, 스마트포인터는 이 참조계수를 자동으로 관리한다 - 수동으로 관리했을 때는 멀티스레드 환경에서 문제가 발생하는데, 스마트포인터를 사용하면 문제가 발생하지 않는다 그 이유에 대해 설명한다. 수동으로 관리했을 때의 문제점- 수동으로 관리하는 것은 말그대로 필요에 따라 AddRef, ReleaseRef 함수를 통해 참조계수를 줄이고 늘림으로써 수동으로 관리하는 것이다. - 1차적으로 캐치할 수 있는 .. 2023. 12. 11. 7. 이벤트와 조건변수 이벤트- 이벤트도 동기화 기법 중 하나로, 스핀락과 비교해보면 스핀락은 자리가 날 때까지 무한히 대기하는 것이고, 이벤트는 승무원에게 자리가 나면 불러달라고 하고 자러 가는 것 - 예제에서의 이벤트는 Windows API를 사용하는 예제이며, 커널오브젝트를 사용한다 - 커널 오브젝트는 Usage count와 Signal State(Signal / Non-Signal)을 가진다. - 먼저 아래는 스핀락을 이용한 Producer / Consumer 패턴#include #include #include #include using namespace std; mutex m1; mutex m2; HANDLE hEvent; queue q; void Producer() { while (true) { lock_guard .. 2023. 12. 11. 6. 데드 락 데드 락- 다중 스레드가 서로 필요로 하는 자원을 얻지 못하고 무한히 대기하는 상태 데드 락이 발생하는 4가지 조건1. 상호 배제 : 자원은 한 번에 하나의 스레드만이 사용할 수 있다. 2. 점유 대기 : 하나의 스레드가 자원을 점유한 상태에서 다른 자원을 요청하고 '대기' 3. 비선점 : 스레드가 다른 스레드의 자원을 강제로 빼앗을 수 없음 4. 순환 대기 : 여러 스레드가 자원을 점유하기 위해 서로를 기다리는 상태가 형성 데드락을 해소하기 위해서는 위 4가지 조건 중 하나를 제거하면 된다.#include #include using namespace std; mutex m1; mutex m2; void Thread_1() { for (int i = 0; i < 10000; ++i) { lock_guar.. 2023. 12. 11. 이전 1 2 3 4 5 다음