[Service강의] owner -> shared_ptr
80
2 câu hỏi đã được viết
아직 다음 강의를 안들어서 잘 예측이 안되지만, owner에 보통 이벤트를 발생시킨 Session의 shared_from_this()를 넣어줄 것으로 예상을 해봅니다.
만약 이 상황에서 io작업이 밀려 오래 걸리거나 누락되어 shared_ptr로 물고 있던 session들이 해제 안되는 문제가 생길 수 있지 않나요?
그렇기 때문에 weak_ptr로 owner을 관리하고, 다만 session이 만료되어 없어지면 유효하지 않은 이벤트이므로 .lock()을 통해 nullptr로 반환 시 예외 처리해주는게 더 안전하지 않나요?
공부를 더 해야겠지만, 사실 아직 잘 이해가 안갑니다. owner와 event등의 수명 주기가 어떤 관계가 있는지 정확히 모르겠지만 방향성을 알려주시면 감사하겠습니다.
Câu trả lời 2
0
기본적으로 비동기 네트워크 이벤트에는 만료 시간이 설정되어 있어
실패를 했으면 했지, 무한으로 밀리진 않습니다.
따라서 우려하신 부분은 일어나지 않습니다.
오히려 반대로 이벤트를 발생시킨 후 결과가
나올 때까진 절대 Session 객체를 날리면 안 됩니다.
(왜냐하면 Session에 이벤트 내부에서 사용하는 recv/send버퍼가 있을 수 있기 때문.
이러면 커널에서 유저레벨로 접근하는 타이밍에 크래시가 날 수 있습니다.)
shared_ptr를 넣은 것은 강의에서 제가 슬쩍 시도해본 방법이지만,
꼭 그렇게 안 하더라도 일종의 이벤트 등록 횟수에 대한 RefCount를 Session에서 따로 관리해
처리하는 경우도 많았습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 서정원님.
세션 객체를 shared_ptr로 관리하는 경우에는 말씀하신 것처럼 refcount에 의해 세션이 만료되었음에도 불구하고 참조가 남아있어 문제가 발생할 수 있습니다. 이는 특히 비동기 IO 작업을 처리할 때 예상치 못한 상황을 초래할 수 있습니다.
이 경우, weak_ptr를 사용하여 세션의 참조를 유지하고 필요할 때만 lock()을 이용해 실제 객체를 참조하는 방식이 더 적절할 수 있습니다. weak_ptr는 참조 횟수에 영향을 주지 않으면서도 세션 객체가 아직 유효한지 확인할 수 있게 해주기 때문에, 만약 세션이 이미 제거된 상태라면 lock() 시도 시 nullptr을 반환하여 자연스럽게 문제를 방어할 수 있습니다.
이와 관련하여 도움이 될 만한 기존 질문과 답변들을 안내드립니다:
Session의 수명 관리를 위한 Ref 카운트 관리 부분 - 여기에서
shared_ptr와 참조 카운트 관리에 관한 토론을 살펴볼 수 있습니다.스마트포인터를 활용한 설계에 대한 질문 -
weak_ptr과shared_ptr의 사용에 대한 좋은 예시를 제공합니다.shared_ptr 질문 -
shared_ptr의 사용에 따른 메모리 관리에 대해 더 자세히 알 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
문제집은 없나요 수업을 어떻게 들어야 할지 모르겠어요
0
108
2
동적배열 Vector의 push_back 함수에서 조건문 질문
0
75
1
디버깅할때 메모리보는법 단축키가 뭐죠??
0
90
1
113-충돌처리 강의에서 22:26 부근의 SetPos()를 적용해도 충돌되지 않고 뚫고 지나가게 됩니다.
0
87
1
SaveFile에서 크래시 발생하는 분들 체크해보세요
1
70
1
수업자료 확인 부탁드립니다.
0
106
3
explicit을 붙였을 때 빨간줄이 뜨는 이유가 맞는지 궁금합니다.
0
100
0
22강에서 구조체와 포인터로 설명해주셨는데 패딩의 경우는 어떻게 되나요?
0
88
2
리소스 매니저 강의 18분 부근
0
89
1
C#에서 생성자 관련 질문
0
83
2
특정 조건에서만 함수를 반환할 때
0
90
2
스택 empty
0
105
2
섹션4 배열실습 질문입니다.
0
133
1
섹션3 '파일분할' 강의 질문입니다.
0
99
1
Defines.h의 DECLARE_SINGLE관련 질문입니다.
0
110
1
세션8 우선순위 큐 pop함수의 Predicate 적용 관련 질문이 있습니다.
0
180
3
섹션9 함수 포인터 관련 질문입니다.
0
137
1
exercise_A 번 문제 해결방법에 대한 질문.
0
150
1
[강의명: virtual 소멸자] 자식 클래스의 소멸자에도 virtual 을 붙이시는 이유가 궁금합니다
0
199
2
Scene과 SceneManager 강의 수강 중 키보드 입력 오류
0
148
1
Window API 강의 수강 중 LARGE_INTEGER 타입 변환 오류
0
198
3
섹션15 스마트 포인터 20:00 질문이요!
0
127
1
55강 수업자료 빌드를 하면 이상합니다.
0
133
1
virtual 소멸자 관련 질문
0
169
1

