묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
데드락 탐지에서 강의 극후반에 LLockStack 관련한 질문입니다!
안녕하세요.나중에 프로젝트 진행하실 땐 lock stack을 TLS로 관리해서 스레드마다 스레드 id가 관리되도록 하신다 말씀하셨습니다. 여기에서 생긴 궁금증입니다. 스레드 id가 부여될 때, 감소하지 않고 증가하는 nameToId().size()로 만들어지는 이상 모든 id가 고유할 거라고 생각합니다.id를 통해서 lockHistory에서 value(set객체)를 꺼냅니다. lockHistory는 TLS에서 관리되지 않는 전역 객체입니다(애초에 그러면 안 되겠죠. 전역적으로 사이클 여부를 탐지해야 하니까요!).스레드 id가 유일한 이상 lockStack을 TLS에서 관리하나 전역으로 관리하는 것이 차이가 없을 것 같은데, 강의 후반에 새로 영상을 추가하시어 '스레드마다 잡고 있는 락이 다르기 때문에 TLS로 관리해야 한다'고 말씀하신 이유가 궁금합니다!id가 전역적으로 1,2,3,4,5,6..이렇게 증가하거나 스레드 별 공간에서 {1,2..} {1,2...} {1,2...} 의 차이 정도로만 생각되어 어떤 본질적인 차이가 있는지 알고 싶습니다!p.s 수업에서 진행한 테스트 코드에서도 문제가 없었던 이유도 궁금증에 한몫을 했습니다.
-
해결됨CloudNet@ - AWS 네트워킹 입문
강의가 오늘까지라
강의가 오늘까지라 열심히 남은 강의를 듣고있는데강의 선택을 해도 해당 강의가 진행이 안되는데 무슨 이유일까요?!뭔가 인프런 자체 문제일 거 같은데 ㅠㅠㅠ강의가 몇 개 안 남아서 다 들어야 하는데 어떡하나요ㅠㅠ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Reader/Writer-Lock 강의 다 듣고 제가 제대로 이해한 게 맞는지 확인받고 싶습니다!
안녕하세요!어제, 강의도 다 안 듣고 질문을 드린 바보 같은 저를 질책하며 강의를 다 듣고 제가 이해한 게 맞는지 확인을 좀 받고 싶습니다!락 획득 정책을 말씀하실 때 살짝 이해가 안 가는 부분이 있었는데 동일 스레드일 때란 걸 알게 되고 나서는 이해에 큰 어려움이 없었습니다. 그래도 확인이 필요하다는 생각이 들었습니다! 각 항목을 번호로 구분해보겠습니다!동일 스레드일 때의 정책이란 게 락을 획득 후 실행될 때는 사실상 싱글 스레드인 것처럼 생각해도 되겠더라구요그렇다고 한다면 GameServer.cpp에서 테스트 코드 작성하실 때 ThreadWrite()일 때 TestPush(), TestPop()의 동작이 한 스레드에서 동작하는 건 당연히 문제가 안 되니까 W->W 혹은 W->R을 허용하는 게 이해가 됐습니다. 한 처리가 완료되고 나서 다른 처리로 넘어가니까요.그렇다면 같은 논리가 적용될 것 같은데 R->W은 왜 안 되느냐에 대해서도 생각해봤는데요. 논리적으로 접근했을 때, 하나의 함수 내에서 읽기 연산 중에 쓰기 연산을 하는 건 단일 책임 원칙에도 위반될 뿐더러 이상한 코드가 나오더라고요. 가령 테스트 코드로 작성하신 TestRead() 안에 TestPush() 혹은 TestPop()을 넣어버리면 안 되니까요. 또한 데드락이 생기지 않기 위해서는 락을 거는 순서가 중요한데, w->r을 허용한 이상 r->w를 허용하면 데드락이 생기기 딱 좋다.ReadLock에 대해서는, WriteLock을 잡고 있지 않은 다른 스레드는 ReadLock을 획득할 수 있다!ReadLock의 주석에 "아무도 소유하고 있지 않을 때"라고 되어 있어서, 조금 헷갈렸는데요. 코드를 보면 마스킹해서 read_count만 확인하는 걸 보고 역시 ReadLock은 WriteLock을 잡고 있지 않은 스레드도 잡을 수 있구나, 카운트 올리는 것만 경합하는 거구나, 로 이해했습니다.2년 전에 처음 강의를 들을 때 제대로 이해 안 하고 넘어갔다가 나중에 큰 화를 당했어서, 이번에는 확실히 이해하려고 하다 보니 코드에서 참 얻을 게 많다 느낍니다. 틀린 게 있으면 지적 부탁드립니다. 감사합니다!
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
타임라인함수를 이용한 캐릭터 강제이동
텔레포트를 구현할 때 네트워크 동기화 문제 때문에 CharacterMovementComponent를 확장하는 방식으로 구현해야 한다고 했는데 그러면 타임라인 함수를 사용하여 캐릭터를 특정 위치로 서서히 이동 시키는 기능도 CharacterMovementComponent를 확장하는 방식으로 만들어야 할까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Reader/Writer 강의에서 마스킹 관련한 질문입니다!
안녕하세요!아직 끝까진 들은 건 아니지만 중간에 큰 의문점이 생겨서 질문드립니다.32형 변수에 상위 비트, 하위 비트를 사용하려면 | 연산을 이용해야 하지 않나요~?가령 상위 비트에 새로운 값을 쓰는 걸 의사 코드로 표현하면,int flag = _lockFlag.load();desired = (flag & 0x0000FFFF) | ((LThreadId << 16) & WRITE_THREAD_MASK);이렇게 하지 않고 다음 코드를 돌리면while (true) { for (int spin_count = 0; spin_count < MAX_SPIN_COUNT; ++spin_count) { uint32 expected = EMPTY_FLAG; if (_lock_flag.compare_exchange_strong(OUT expected, desired)) { ++_write_count; return; } } }write flag를 쓸 때마다 read flag가 날아가는 것 같아서요!
-
미해결BHPT - 호스트 기반 모의해킹 기초
닉네임?
모든 질문은 레드라쿤 디스코드 서버의 BHPT 질문게시판에 해주세요
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
쓰레드 질문
선생님 강의 잘 듣고 있습니다. 혹시 쓰레드 시작쓰레드 종료stop호출종료 대기중종료 성공 순으로 로그가 떠야 하는데다른 온라인 게임 실행 도중에 디버깅을 하면로그 순서가 조금 바뀌더라구요 이 현상은 왜 일어나는건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Lock-Free Stack #2 01:16쯤에 말씀하신 동시에 TryPop() 할 경우..질문입니다.
안녕하세요!동시에 TryPop() 을 할 경우, oldHead를 참조하는 스레드가 있을 수 있고 이 때 무작정 해제해버리면 use after delete 오류가 발생할 수 있다고 하셨습니다.TryDelete() 함수를 구현하실 때, 1 == popCount 안에서 delete old_head 를 할 때는 이미 분리했으니까 괜찮다고 하셨는데요. 첫 문단에서 언급한 부분과 반대되는 말을 하신 것 같다는 느낌을 받았습니다.제가 생각했을 때는, 저희 수업 때 사용하신 예제 코드에서는, cas 연산을 통해 oldHead 를 분리했기 때문에 use after delete 오류가 안 날 것 같단 생각이 들더라고요.궁금해서 테스트를 해봤습니다.TryDelete() 함수를 호출하지 않고 바로 delete old_head; 를 호출하는 코드를 넣었고요, 지금 이 질문을 올리고 있는 와중에 push() 는 sleep_for(1ms)를 주고 pop()을 하는 스레드는 5개를 돌려서, 진단 도구에서 확인되는 프로세스 메모리가 1mb이 유지되게 설정해서 30분 넘게 돌려보고 있습니다. 오류가 안 나고 있는 광경을 목격 중입니다. 그냥 운이 좋은 걸까요?오류가 발생하지 않는 이유는 다음과 같다 생각합니다.atomic 변수인 head에서 cas 연산을 하기 때문에 간발의 차이로 먼저 다음 코드를 통과한 스레드가 획득한 oldHead는 다른 스레드가 이후에 될 oldHead와 같지 않다. while 조건에서 true를 반환하는 순간 head는 head의 next를 가리키고 있게 되기 때문이다. compare_exchange_weak() 함수가 true를 반환하면 head는 원자적으로 head->next를 가리키는 상태가 된다.while (old && false == _head.compare_exchange_weak(old, old->next)) return false; 고견 부탁드립니다.멋진 강의 감사합니다.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
수정폼과 수정은 머가 다른건가요?
회원 수정 폼 : /members/{id}/edit ➡ GET회원 수정 : /members/{id}/edit, /members/{id} ➡ POST이라 하셧는데 수정폼과 수정은 머가 다른건가요?또한 왜 url을 맞추는게 좋다고 하신걸까요?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
Http 메소드 사용 예제
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요! 각 메서드 마다 역할이 무엇인지는 이해했습니다. 하지만 한 가지 헷갈리는 것이 있는데, 만약 아래 코드처럼 메서드 매핑은 GET으로 해놓고 실제 로직은 데이터를 삭제하거나, 혹은 DELETE로 매핑 해놓고 실제 로직은 단순히 데이터를 조회하도록 구현해도 올바르게 동작 하더라구요.//jpa 사용 @GetMapping("users/{id}") public void deleteMember(@PathVariable(name = "id") Long id){ memberService.deleteMember(id); }그래서 저는 Http 메서드를 아래 2가지로 이해했는데 맞는지 확인 부탁드립니다!!Http 메서드는 내부 로직과 상관없이 단순히 데이터를 어떻게 처리할 것인지를 구분해 주기만 하는 개념적인 부분이다. 예를 들어 '해당 컨트롤러에서는 리소스가 없을 경우 새로 생성하고, 있을 경우에는 덮어쓰는 로직을 구현할 것이기 때문에 PUT을 사용해야지' 라고 시각적(?) / 개념적(?)으로 알려주는거죠.같은 URI에서 어떤 메서드로 요청을 처리할지 구분한다. 예를 들어 users/{id}에서 GET과 POST 중 어떤 메서드에 매핑되어 있는 로직을 처리할지 구분하는거죠.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
서버가 알아서 회원을 식별해서 URI를 만들어준다.가 무슨의미일까요?
클라이언트는 등록될 리소스의 URI를 모른다. 회원 데이터를 서버에 요청하고 서버가 알아서 회원을 식별해서 URI를 만들어준다.회원등록 : /members ➡POSTPOST /memebers클라이언트가 결정하는 게 아니라 서버가 새롭게 등록된 리소스의 URI를 생성한다.HTTP/1.1 201 Created/members/100라고 하셨엇는데 서버가 알아서 멤버를 식별해서 100번으로 URI를 생성한다는걸까요??
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
GET일때도 CONTENT-TYPE을 설정할수 있나요?
GET인데 Content-type으로 multipart/form-data 으로 전송가능한가요>?content-type으로 전송시에는 무조건 post쓰나요?
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
수강 연장 부탁 드립니다.
업무로 인해, 수강을 완료하지 못했습니다.수강기간 연장 부탁드려요!
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의를 듣던중에 궁금한점이 생겨서 질문드립니다.
Reader-Writer Lock 구현중에 Atomic 변수를 사용하고 있는데, Atomic 변수자체가 lock이 포함되어 있어서 대규모 Read가 병렬적으로 처리되는 상황이 아니라면 일반 lock을 사용하는 것이 더 효율이 좋을 것 같습니다.하지만 Reader-Writer Lock이 의미가 있을 정도로 대규모 Read가 빈번하게 일어나는 경우에는 WriteLock쪽에서 기아 현상이 발생할 것 같습니다.그렇다면 Reader-Writer Lock은 피크 타임에 대규모 Read가 발생하는 경우에만 사용하는 건가요?(LThreadId << 16) & WRITE_THREAD_MASK 부분에서 굳이 & 연산을 추가로 하는 이유가 뭔가요?
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
수강연장부탁드립니다
감사합니다
-
해결됨CloudNet@ - Amazon EKS 기본 강의
ingress 도메인 연결 문의
Warning FailedAddFinalizer 10m (x12 over 10m) ingress Failed add finalizer due to Internal error occurred: failed calling webhook "vingress.elbv2.k8s.aws": failed to call webhook: Post "https://aws-load-balancer-webhook-service.kube-system.svc:443/validate-networking-v1-ingress?timeout=10s": no endpoints available for service "aws-load-balancer-webhook-service"정상적으로 연결은 된 것 같은데 ingress에 해당 이벤트가 나오는건 왜그럴까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
따로 쓰레드를 만들지 않았는데 멀티쓰레딩 하는 이유
지금 Command 패턴강의 까지 수강중인데,멀티쓰레드 파트에서 배웠던 락 처리는Thread t 이렇게 만들고 시작해야멀티쓰레드 환경으로 변하는걸로 알고있습니다 하지만 지금까지 보면멀티쓰레드를 고려하여 락을 계속 추가해주고 있는데요args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted)이것때문에 다른 쓰레드들이 풀리기 시작한건가요?궁금합니다
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
PUT으로 파일 덮어쓰는 것에 대한 질문이 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]HTTP API 설계 예시 강의를 들으면서 든 궁금증이 있습니다.스토어 방식으로 URI를 설계하면, /files/{fileName} -> PUT이런식으로 파일을 클라이언트가 덮어 씌워주는 것으로 이해했습니다. 그런데, D드라이브의 file 이라는 디렉토리에 파일이 저장된다고 했을때, fileName은 유저가 설정한 파일이 아니라 UUID를 붙여서 새롭게 파일명을 만들어 저장한다고 MVC 2편 강의에서 배웠습니다. 그러면 fileName으로 덮어 씌우는것이 사실상 불가능 한것이 아닌가요?? 왜냐하면, UUID를 실제 생성할때마다 다르게 생성되는데... 처음에 image.png를 업로드 했을때, 123-123.png라고 저장되어도 다음에 image.png를 업로드 했을때, 123-124.png로 파일명이 만들어지면 123-123.png가 덮어씌워지는 것이 아니라, 123-124.png라는 새로운 파일이 생성될것 같습니다. 혹시 제가 잘못 이해한 부분이 있다면 알려주세요ㅠ
-
미해결CloudNet@ - Amazon EKS 기본 강의
ingress 외부 dns 설정
안녕하세요.ingress를 통한(alb) 외부 dns 설정이 잘 안되는데 방법 알려 주실 수 있을까요? 여러 애플리케이션을 포트 단위로 서비스 하려 합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
식별자 및 헤더 에러
2022버전인데정의는 되어있으나 특정 tcp/ip함수들을 식별하지 못하는 현상이 있습니다.(헤더가드 다 하였음)제 경우에는 inet_ntop 함수 단 하나만 컴파일러가 식별하지못하는 에러가있어서 stackoverflow나 reddit을 찾아도 원하는 상황에 및 해결법은 나오지않아pch.h환경에서 쓰기때문에 GlobalPch.h 에서#include <WinSock2.h>#include <mswsock.h>#include <ws2tcpip.h>#include <windows.h>4가지 헤더를 이 순서대로 배치하고 프로젝트 별 헤더에서는 위의 4가지를 선언하지않으니 해결되었습니다.혹시나 특정함수 단 하나만 식별되지않거나하면 시도 해보시기 바랍니다.저는 시간날렸어도 누군가는 금방 해결해서 다음step으로 빠르게 가길 빕니다.