작성
·
265
1
안녕하세요
강의 수강중 궁금증이 생겨서 질문 올립니다.
제가 제대로 이해한것이 맞다면
_sendBuff에 enqueue를 하는 부분 자체에 lock이 걸려있고
그 안에 RegisterSend가 실행되는 조건인 _pendingList에 add가 되는 유일한 조건이 RegisterSend인 상태인데
이러한 상황에서 SendQueue에 접근할 때 "다른 프로세스에서 미리 접근만 하고 아직 registerSend를 하지 않는 상황"이 존재할 수 있는지요
sendQueue에 접근 -> SendAsync 이라는 큰 틀 사이사이에 멀티쓰레드를 고려한 여러가지 안전장치들이 모두 시작점의 lcok에 걸려있어서 그 의미가 없어지는것이 아닌가 하는 생각이 듭니다.
감사합니다
답변 2
1
그 안에 RegisterSend가 실행되는 조건인 _pendingList에 add가 되는 유일한 조건이 RegisterSend인 상태인데
네 이건 맞지만, 간과하면 안되는 부분은
_socket.SendAsync() 부분이 비동기 함수라는 점입니다.
pending이 true라면, 나중에 네트워크 전송이 완료되는 시점에서
(보통) 다른 쓰레드를 통해 OnSendCompleted가 호출되겠죠.
OnSendCompleted 내부에서도 _sendArgs, _pendingList를 건드리고 있으니
RegisterSend, OnSendCompleted에 각각 lock을 잡아주지 않는다면
멀티쓰레드 이슈가 생길 수 있습니다.
질문이 이상합니다.
[최적화가 끝난 결과물]이란 존재하지 않고
어차피 프로젝트마다 다 다르게 구현합니다.