• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Send lock 관련 질문

23.08.11 01:38 작성 조회수 236

0

    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

이정석님의 프로필

이정석

질문자

2023.08.11

조금 고민해보니 답이 나오네요 SendAsync이니까 아직 전송이 완료되기 전에(쓰레드A의 SendAsync) 쓰레드B가 Send를 하면 lock구역에 진입하면서 pendingList.Count가 1이상일 수 있을것 같네요