IncreaseHeadCount 부분에서 CountedNodePtr newCounter = _oldCounter 를 해주는데 newCounter 같은 경우 지역변수이기 때문에 애초에 경합이 발생할 수 없지 않나요? int 변수를 공유하는 것도 아니고 완전히 새로운 지역 변수이기 때문에 좀 이해가 안됩니다. 오히려 oldCounter를 바꿔주기 위해서 head.compare _exchange_strong을 하는거 아닌가요?
shared_ptr에도 레퍼런스 카운트 블록안에 weak값이 존재하고 shared_ptr타고 들어가서 보니 shared_ptr도 weak가 0이될때 그제서야카운트 블록을 날려주는거 같은데. 만약 shared_ptr에 weak가 0이 되지 않는상황이 오면 계속 남아있을거 같은데 shared_ptr에서는 weak가 절대0이상이 될수가 없는건가요?? weakCount는 weak_ptr로만 늘려줄수 있어서 상관이 없는걸까요??
강의 시간 02:07 atomic타입으로 Node 포인터 변수를 선언 했는데 <atomic> 헤더를 선언하지않았는데 빌드가 잘되던데 왜그런건가요?? 미리 컴파일된 헤더나 mutex안에 atomic이 있지도 않은데 말이죠.. 아직 c++ 이 많이 익숙치 않아 질문남깁니다. ㅜㅜ
강의 tcp 서버 실습 강의를 보고 dummyclient 에서 작성한 코드를 바탕으로 언리얼엔진과 간단히 연동을 해보려 하는데 언리얼 c++에서 어디 클래스 부분에 코드를 붙여야 할 지 감이 안잡혀 질문 드립니다. 기본 빈 클래스에 FRunnable 상속을 받아 진행해봤는데 빌드하는 부분에서 자꾸 오류가 떠서 막막하네요 ㅠㅠ
Dfs 함수에서 if(_discoveredOrder[here] < _discoveredOrder[there]) contiue; 해당 로직을 통해서 순방향 간선이면 continue를 하여 넘어갔는데 해당 if 문에 걸리는 경우가 존재하나요?? _discoveredOrder[there]의 값이 -1이 아니라는 뜻은 자신의 부모로부터 이미 방문한 적이 있다는 뜻인데 if 문에 걸리는 것이 없는 것 같아서요. 어떤 경우에 발생하는 지 궁금합니다.
영상 구현에서는 TypeList를 직접 작성 했는데 실제 사용에서는 inheritance hierarchy를 탐색해서 TypeList를 생성해야 할 것 같다는 생각이 듭니다. 일단 template meta programming을 잘 다루지 않아서 hierarchy를 어떻게 수집 할 수 있을지도 감이 오지 않네요. 수집이 가능하다 해도 hierarchy가 크다면 hierarchy tree의 클래스 개수 n^2 만큼의 메모리를 점유하게 될 텐데 해당 부분도 우려가 됩니다. 메모리 문제를 해결하기 위해서 _typeId 초기화 시점에 parent id도 추가적으로 선언+초기화하고 런타임 비용을 조금 더 쓰더라도 id를 hierarchy를 따라 올라가서 casting 가능 여부를 판단하는 방식은 어떨까요?
안녕하세요 강사님 강사님의 강의를 들으며 게임 서버 개발자를 꿈꾸는 학생입니다. 다름이 아니라 이번에 프로젝트를 진행할 기회가 생겨서 언리얼 클라와 IOCP 서버를 연동해 게임을 만드려고 합니다. 이때 클라측에선 네트워크 스레드를 별도로 두어 패킷의 송수신을 담당하도록 하고 수신받은 데이터를 전역에서 존재하는 큐를 여러개 두어(인게임 패킷만 다루는 큐, 로비에서의 패킷만 다루는 큐 등) 여기에 밀어주도록 하고 메인 스레드에서 이를 락을 걸어 뽑아서 쓰는 형식으로 구현할 계획입니다. 여기서 궁금한 점이 이런 소켓 연결 관련 객체와 글로벌 큐를 어느 위치에서 가지고 있어야 하는지입니다. 전역으로 사용하고 연결이 끊기면 안되므로 Game Instance를 생각하고 있습니다만 더욱 좋은 방법이 있는지 강사님께 여쭤보고 싶습니다. 읽어주셔서 감사합니다!
안녕하세요~ 선생님. 강의를 복습하다 보니 compare_exchange_strong 문법에 호기심이 생겨서 찾아보니, atomic과 compare_exchange_strong은 C++ 11 부터 추가된 문법이라고 그러더라고요. 저는 현재 연습용으로 옛날 문법(C++ 11 이전)을 이용해서 Read-Write Lock을 구현해보려고 하는데 atomic 과 compare_exchange_strong,weak 없이 구현할 수 있을까요? ㅠㅠ...
안녕하세요. 강의 감사히 들었습니다. TSharedPtr<T>이 thread safe한지에 대해 고민해보던 중 질문이 생겨 글 작성하였습니다. 관련된 다른 질문들을 보아도 의문이 해결되지 않아서요. class User { public: changeWraight(WraightRef wraight) { wraight_ = wraight; } WraightRef wraight() { return wraiht_; } private: WraightRef wraight_; }; thread 1 User *user = Server::getUser(userId); user->changeWraitht(wraight); thread 2 User *user = Server::getUser(userId); WraightRef wraightRef = user->wraight(); 위 상황에서 thread 2 가 실행되어 복사생성자가 호출되었고, 복사생성자에서 Set함수가 호출되어 아래 조건문 까지 검사하고 thread1이 실행되었다고 가정한다면 WraightRef를 사용하여도 복사시 문제가 발생할 수 있을 것이라고 생각했는데요. 제가 잘못생각한 것이 있다면 피드백 부탁드리고 싶습니다. inline void Set(T* ptr) { _ptr = ptr; if (ptr) { ptr->AddRef(); } }
안녕하세요. placement new 문법에 궁금한 게 있는데요. 1. new(header) MemoryHeader(size)를 해석하면 new(이미 할당된 메모리 주소)생성자(매개변수) 인 것 같은데 맞나요? 2. new 문법은 힙 메모리에 영역을 할당하고 생성자를 호출하는 거고, placement new는 이미 할당된 메모리에 생성자를 호출하는 거 같은데 제가 이해한 게 맞을까요?
너무 많은 데이터를 보내면 안되기 때문에 예외 체크를 하여 빠져나온다고 하셨는데, 왜 그렇게 하는 지 알 수 있을까요?? ex) 굉장히 많은 아이템을 가지고 있는 캐릭터의 정보를 보낸다고 가정할 때, 컨텐츠 쪽에서 SendBuffer의 버퍼 사이즈를 초과할 것을 예상하여 여러개의 SendBuffer로 쪼개서 ReigisterSend 하는 곳으로 넘겨줄텐데 왜 한번 더 예외체크를 해야되는 지 헷갈립니다.
안녕하세요, 데드락 탐지 건에서 질문을 하고 싶습니다. 제가 강사님 프로젝트를 다운받아서 코드를 제대로 살펴보았음에도 육안으로 구분한 것이라 제가 간과한 부분이 있을 수도 있습니다. 영상 마지막 부분에 std::stack<int32> 부분은 선언하지 않고, 순전히 영상 전의 내용과 고친 부분의 후로 나뉘기는 하지만 결과는 동일합니다. 결과적으로는 무한루프 가 발생하는데, 이게 DFS 내부적인 로직이 꼬여서 무한루프가 발생하는 것인지, 아니면 스레드 끼리의 DeadLock 으로 인해서 생긴 무한루프 때문에 충돌이 난 것인지 제가 확인을 할 방법이 없습니다. (정확히는 디버깅 미숙 숙련도 이슈입니다.) 혹시 어디 부분이 제가 빠트렸거나 유추 가능한 원인요인들이 있을까요? https://drive.google.com/file/d/1HYHZMhf6wkkHxvqLIpAU1-SsSNKS4rO3/view?usp=drive_link