Send lock 관련 질문
411
작성한 질문수 1
public void Send(byte[] sendBuff)
{
lock (_lock)
{
_sendQueue.Enqueue(sendBuff);
if (_pendingList.Count == 0)
RegisterSend();
}
}
void OnSendCompleted(object sender, SocketAsyncEventArgs args)
{
lock (_lock)
{
if (args.BytesTransferred > 0 && args.SocketError == SocketError.Success)
{
try
{
_sendArgs.BufferList = null;
_pendingList.Clear();
// Doing
if (_sendQueue.Count > 0)
RegisterSend();
}
catch (Exception e)
{
Console.WriteLine($"OnSendCompleted Failed {e}");
}
}
}
}수업을 들으면서 Send와 OnSendCompleted에 lock이 서로 다른 두개이상의 쓰레드가 동시에 sendQueue, pendingList에 Write하는 것을 방지하는 것이라고 이해했습니다.
그리고 Send의 if문이 다른 쓰레드가 전송중일때를 체크하는 것이라고 들었는데 저 2개의 lock구조에서, 쓰레드A가 OnSendCompleted의 lock구역안에 있을 때 쓰레드B가 Send의 lock구역에 진입이 가능한지 궁금합니다.
만약 접근이 안된다면 pendingList.Count가 항상 0이 되지않을까 생각하고 있습니다.
답변 1
0
조금 고민해보니 답이 나오네요 SendAsync이니까 아직 전송이 완료되기 전에(쓰레드A의 SendAsync) 쓰레드B가 Send를 하면 lock구역에 진입하면서 pendingList.Count가 1이상일 수 있을것 같네요
TLS 질문드립니다.
0
52
2
SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.
0
55
2
Unity Span
0
81
2
XML, Dll 차이점
0
110
2
Session 질문입니다
0
81
1
Write Read 커서 키워드
0
78
1
더미 클라이언트 수에 따른 OnDisconnect 발생
0
73
2
네트워크 Send 전담 스레드 배치
0
100
2
UnhandledException 으로 서버 터지는 경우
0
88
2
컨텐츠 단, 엔진 단
0
106
1
질문 있습니다
0
78
2
C# 게임서버 3D MMORPG
0
152
2
유니티6 버전
0
100
2
receive하는 부분과 send하는 부분의 차이
0
134
2
커서의 위치의 중요성
0
105
2
C++ 전혀 모르는데 C# 서버
0
170
2
강의에 질문이 있습니다
0
88
2
멀티스레드 이해도 질문
0
96
1
500 vs 500
0
131
3
OnAcceptHandler 액션 함수
0
64
1
이 정도 서버의 객관적인 수준이 궁금합니다.
0
193
2
36. Serialization #3 에서 string (name) 코드 수정 질문
0
83
2
외부 컴퓨터와의 통신 방법이 궁금합니다
0
107
1
스핀락 질문.
0
111
2





