send와 lock
355
22 asked
안녕하세요
강의 수강중 궁금증이 생겨서 질문 올립니다.
제가 제대로 이해한것이 맞다면
_sendBuff에 enqueue를 하는 부분 자체에 lock이 걸려있고
그 안에 RegisterSend가 실행되는 조건인 _pendingList에 add가 되는 유일한 조건이 RegisterSend인 상태인데
이러한 상황에서 SendQueue에 접근할 때 "다른 프로세스에서 미리 접근만 하고 아직 registerSend를 하지 않는 상황"이 존재할 수 있는지요
sendQueue에 접근 -> SendAsync 이라는 큰 틀 사이사이에 멀티쓰레드를 고려한 여러가지 안전장치들이 모두 시작점의 lcok에 걸려있어서 그 의미가 없어지는것이 아닌가 하는 생각이 듭니다.
감사합니다
Answer 2
1
그 안에 RegisterSend가 실행되는 조건인 _pendingList에 add가 되는 유일한 조건이 RegisterSend인 상태인데
네 이건 맞지만, 간과하면 안되는 부분은
_socket.SendAsync() 부분이 비동기 함수라는 점입니다.
pending이 true라면, 나중에 네트워크 전송이 완료되는 시점에서
(보통) 다른 쓰레드를 통해 OnSendCompleted가 호출되겠죠.
OnSendCompleted 내부에서도 _sendArgs, _pendingList를 건드리고 있으니
RegisterSend, OnSendCompleted에 각각 lock을 잡아주지 않는다면
멀티쓰레드 이슈가 생길 수 있습니다.
0
답변 감사합니다.
그렇다면 send를 하는 거의 모든 부분에 lock이 결려있는 상태인데
성능을 고려했을때 lock을 거는 부분은 적을수록 적절하다고 알고있습니다.
여기서 lock을 잡는 부분을 줄이거나 좀더 최적화를 하려는 시도가 의미가 있나요 아니면 이러한 구조는 이미 오랜시간 최적화가 끝난 결과물이므로 이대로 받아들이는것이 좋나요?
TLS 질문드립니다.
0
37
2
SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.
0
42
2
Unity Span
0
68
2
XML, Dll 차이점
0
99
2
Session 질문입니다
0
75
1
Write Read 커서 키워드
0
69
1
더미 클라이언트 수에 따른 OnDisconnect 발생
0
66
2
네트워크 Send 전담 스레드 배치
0
94
2
UnhandledException 으로 서버 터지는 경우
0
82
2
컨텐츠 단, 엔진 단
0
100
1
질문 있습니다
0
73
2
C# 게임서버 3D MMORPG
0
141
2
유니티6 버전
0
94
2
receive하는 부분과 send하는 부분의 차이
0
128
2
커서의 위치의 중요성
0
99
2
C++ 전혀 모르는데 C# 서버
0
165
2
강의에 질문이 있습니다
0
83
2
멀티스레드 이해도 질문
0
90
1
500 vs 500
0
122
3
OnAcceptHandler 액션 함수
0
58
1
이 정도 서버의 객관적인 수준이 궁금합니다.
0
186
2
36. Serialization #3 에서 string (name) 코드 수정 질문
0
79
2
외부 컴퓨터와의 통신 방법이 궁금합니다
0
100
1
스핀락 질문.
0
104
2

