요약한게 맞는지 확인해주실 수 있나요? 1. Pop은 현재 head를 따로 oldHead로 저장하고, 이것이 nullptr이 아니란 소리는 head가 존재한다는 뜻, 즉 1개 이상 스택에 값이 존재한다는 뜻임 2. 스택에 값이 1개 이상이면 oldHead는 nullptr이 아닐 것이고 pop을 한번 했을 때 oldHead에 head가 제대로 값이 들어갔다면 while문을 통과하면서 _head=oldHead->next; 가 원자적으로 실행되고, 아래쪽을 쭉 실행하다가 TryDelete 함수가 호출될 것임 2-1. 이때 만약 다른 Pop 쓰레 드들이 있다고 하면, 요놈들은 첫 Pop에서 _head가 oldHead->next로 바뀐것으로 인해 while문을 통과하지 못하므로 oldHead=_head가 실행되어 다시 while문이 불려져서 다음 원소를 상대로 pop을 진행함 -------------------- 이후는 TryDelete입니다 3. popCount가 1인 경우 : TryDelete가 실행되는 순간에도 popCount가 1이라면 아직은 Pop이 다른 쓰레드로 호출되지 않은 상태임. 3-1-1. pendingList를 읽어 삭제하려고 하는데, 이걸 읽었는데도 popCount가 아직 1이라면 Pop이 pendingList를 읽는 사이에 한번도 호출되지 않은 것이므로, 읽은 pendingList와 연결된 모든 노드를 이참에 삭제함 3-1-2. pendingList를 읽어 삭제하려고 하는데, 이걸 읽은 사이에 popCount가 증가하여 Pop이 다른 쓰레드에서 호출됐다는 걸 알았으니 읽어들인 pendingList를 다시 돌려놓는다. 3-2. pendingList도 다 삭제햇으니(돌려놨으니) 현재 노드를 삭제해주면 된다. 4. popCount가 1 초과인 경우 : TryDelete가 실행되는 순간에 popCount가 1을 넘어버렷다면, Pop이 다른 쓰레드에서 호출된 상태이므로 지금 당장 삭제하지 말고 삭제 예약만 해놓도록 한다.
큐에서 데이터를 꺼내는 작업 자체가 여러 스레드가 동시에 들어가도 의미가 없거나 wsasend가 스레드 안전하지 않아서 그런건가요? recv도 그렇고 send도 그렇도 하나의 세션에 대한 본질적인 작업은 사실상 하나의 스레드만 수행할 수 있다고 이해하면 되는걸까요?(사실상 여러 스레드가 접근해도 실질적인 세션의 공유자원(버퍼 등등)에 대해 순차적으로 접근할 수 있으므로 )
패킷 리시브 할 때 WSARecv의 작동에 의문이 생겨 질문을 남겨봅니다. [Size][ID][Hello World] 라는 패킷을 수신하다고 가정해봤을 때 Session::ProcessRecv 가 호출된 시점에서 [Size][ID][Hello] 까지의 데이터를 받았다고 가정하면 PacketSession::OnRecv에서 dataSize가 header.size보다 작기 때문에 0바이트를 Return 해 버리고 끝납니다. 이러면 RecvBuffer의 _writePos, _readPos에는 아무 변화 없이 다시 RegisterRecv를 걸어버리는데요 다음 RegisterRecv (WSARecv) 를 걸 때 , 읽다만 데이터의 시작 지점 부터 다시 읽어버리는게 아닌가 싶어서 여쭤봅니다 첫 번째 ProcessRecv를 받았을 때 RecvBuffer이 다음과 같다면 두 번째 ProcessRecv에서는 남은 "World" 데이터가 RecvBuffer 뒤쪽에 쌓이게 되는지, 아니면 변하지 않은 _writepos 위치 때문에 앞에서 부터 다시 작성되게 되는지 의문이 생겨 여쭤봅니다. 제 생각 중 만약 전체 바이트가 아닌 일부 바이트만 수신되는 위와 같은 과정에서 WSARecv는 2번 따로 따로 호출된다고 이해한게 맞으며, RecvBuffer에 문제없이 데이터가 이어서 들어가게 되나요?
항상 좋은 강의 감사드립니다. 1. if (Conversion<const FromType*, const ToType*>::exist) 이 부분에서왜 포인터를 사용했는지 궁금합니다. 2. TypeConversion은 결국 많은 템플릿을 생성하게 되는데 그럴 경우 메모리에 문제가 없는지 궁금합니다. 3.Conversion 의 경우 컴파일러가 비슷하다고 판단 할경우 From을 To로 변환을 하고 결국 그걸 이용해 변경 여부를 판단하게 되는데 컴파일러 입장에서 비슷할 경우 변환을 시키지 않는 것이 이득일텐데 굳이 변환을 하는 원리가 궁금합니다. 4. 마지막으로 struct로 만드실 때와 class로 만들 실 때의 기준이 있으신가요? template 흑마법 정말 잘 배웠습니다 핵? 편법같은 느낌이 있어 관심이 많이 가게 되었습니다. 추후 강의 기대하겠습니다!
vector<MemoryPool*> _pools; // 메모리 크기 <-> 메모리 풀 // 0(1) 빠르게 찾기 위한 테이블 MemoryPool* _poolTable[MAX_ALLOC_SIZE + 1]; 이부분에서 결국에 _pools도 = pool을 할당하고 _poolTable도 크기에 맞게 = pool로 할당하면 _poolTable로 통합해서 사용하면 안되는지 궁금합니다.
페이징의 최소단위가 4KB로 알려주셨습니다 그럼 클래스의 변수가 아무리 많다고 해도 1000Byte가 넘기 힘들 것 같습니다 그상태에서 최소 페이징단위인 4094Byte를 계속 할당하는 방식으로 하면 말씀하신대로 존재하지 않는 메모리는 쉽게 잡을 수 있지만 메모리 낭비가 너무 심한 것 같습니다 제가 계산을 잘못한 것인지 아니면 생각하는 방향성이 잘못된것인지 궁금합니다.
안녕하세요. 커리큘럼 관련되서 질문드리고자 이렇게 글 올립니다. 저는 일단 C++을 사용하는데 있어 큰 무리없이 사용하는 편입니다. (modern c++포함) 반면 C#은 거의 모르는 상태인데요, 강사님 커리큘럼중에 C#을 이용해서 MMORPG를 만드는 커리큘럼도 있던데 아래처럼 병행해서 커리큘럼을 짜도 될지 궁금해서 문의 드립니다. [C#과 유니티로 만드는 MMORPG게임 개발시리즈] Part1, Part3, Part7, Part9 만 듣고, [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4 이렇게 들어서 일단 Unreal 로 연동하는 강의가 나올때까지, 유니티 2D게임을 C++게임서버에 연동해보고 싶은데요, 굳이 C# 게임서버 제작 강의를 들어야할 필요가 있을까요?? C#으로 게임서버를 만들어야겠다는 생각이 들면 듣겠지만, 지금은 우선 게임 클라이언트 자체를 서버에 연동시키는것(구체적으로 맵을 어떻게 서버에서 처리하고, 스킬이나 hit 판정을 어떤식으로 하는지에 대한 것들)을 목표로 하고 있는데, C#게임서버 강의랑 C++ 게임서버 강의가 겹치는 부분이 많아서 C#게임서버 강의를 통해 들어야할지 고민이 됩니다. 결론으로 C# 강의 Part1, Part3, Part7, Part9 와 C++강의 Part4 이렇게 병행하는데, 무리 없이 커리큘럼을 수행할 수 있는지 궁금합니다. 긴글 읽어주셔서 감사드리며, 항상 좋은 강의 올려주셔서 감사합니다.!!!
IOCP강의를 듣고 실습을 하는 중에 이상현상?이 생겨서 질문 드립니다. 정상적으로 실행되거나 밑에 현상이 생기거나 반복이 되고 있는데 뭐가 문제일까요... 코드는 올려주신것과 똑같습니다! 1) accept만 뜨고 client connected가 안뜨는 경우 (클라에서 송신은 계속 하고있다.) 2) server에서 break point를 잡고 실행하면 client connected도 잘뜨고 수신도 잘합니다. (처음 한두번은 800, 200 이렇게 한꺼번에 데이터를 수신합니다.) 3) 다시 break point를 해제하면 1번과 같은 상황이거나, 정상적으로 처음부터 100씩 수신받는 상황이 랜덤으로 발생
StompAllocator에서, void StompAllocator::Dealloc(void* p) { // 이건 Offset을 처리해줄 필요없지만... 그래도 모르니... int64 addressNo = reinterpret_cast<int64>(p); addressNo &= 0xffffffffffff1000; ::VirtualFree((void*)addressNo, 0, MEM_RELEASE); } 이런식으로 페이지 끝단에 위치했던 p를 다시 페이지 시작 지점으로 offset을 지정 해줄 필요가 있나요?? VirtualFree 는 p가 존재하는 페이지 전부를 해지시켜주는데 해당 페이지 끝단에 있던, 시작주소에 있던.. 그 페이지가 날라가는건 똑같은걸로 아는데요 ㅠㅠ