인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

스터디님의 프로필 이미지
스터디

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Session #3

send, lock 부분에서 질문 있습니다.

작성

·

140

·

수정됨

0

public void Send(byte[] sendBuff)

{

lock (locked)

{

sendQueue.Enqueue(sendBuff);

if (pendingList.Count == 0)

RegisterSend();

}

}

이 부분에서 lock이 걸려있으면, 먼저 들어간 스레드가 작업을 완료할 때 까지 다른 스레드가 접근을 못하잖아요?

근데, 먼저 작업을 하는 스레드가 pendingList에 있는 값을 다 처리하기 전까지는 lock이 안 풀리고, 다 처리를 했다면 pendingList.Clear();를 통해 Count는 항상 0을 반환할텐데 if(pendingList.Count == 0) 부분을 체크할 필요가 있는지 궁금합니다.

답변 2

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

네 일단 현 상황에선 그게 맞구요. (없어도 되긴 함)
다만 이 부분은 나중에 다양하게 수정이 가능한데,
강의에선 제일 간단한 방법으로 구현이 되어 있으나 (락 걸고 끝까지)
조금 더 최적화를 하자면 무조건 먼저 들어온 쓰레드가 전송을 담당하게 하는 경우가 있습니다.
즉 아래와 코드 같이 먼저 들어온 애가 호출을 하게 하면서,
RegisterSend를 락없이 하는 것도 구려할 수 있습니다.
이러면 RegisterSend가 호출되고 있는 과정에서도, 다른 쓰레드가 sendQueue에다 밀어넣을 수 있게 되죠.
TMI지만 테라는 아래와 같이 락없이 보냈고 블소에선 락을 걸고 보냈던 기억이 있네요

bool send = false;

lock (locked)
{
sendQueue.Enqueue(sendBuff);
if (pendingList.Count == 0)
send = true;
}

if (send)
RegisterSend();

스터디님의 프로필 이미지
스터디
질문자

강사님께서 제시해주신대로 코드를 짜면 데이터 전송 도중에 다른 스레드가 큐에 데이터를 넣을 수 있겠네요. 이후에는 한 스레드에서 막대한 데이터를 전부 감당하기 힘드니까 병렬적으로 처리할 방법이 필요하겠군요. 답변 감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

스터디님의 질문은 lock 키워드 사용과 관련하여 pendingList.Count == 0 조건의 목적과 필요성에 대한 부분입니다. 관련하여, lock 내부에서 조건을 체크하는 이유와 멀티스레드 환경에서의 동작 방식을 포함한 설명이 필요한 것 같습니다.

다음은 스터디님의 질문과 유사한 상황에 대한 질문 및 답변 링크입니다:

  • “lock과 send 질문!” - 이 질문에서는 lock을 사용하여 비동기적으로 데이터를 보낼 때 pendingList의 개수 체크가 어떻게 이루어지고, 왜 필요한지에 대한 상황이 설명된 것과 비슷합니다.

  • “send와 lock” - 이 질문에서는 lock에서 RegisterSend를 호출하는 조건과 SendQueue에 접근하는 과정에서의 멀티쓰레드 처리에 대한 이슈를 논의합니다.

lock 키워드를 사용하는 주된 이유는 멀티스레드 환경에서 공유 자원에 대한 접근을 동기화하여 경쟁 상태(race condition)를 방지하는 것입니다. 특히 스터디님의 질문과 관련하여, if(pendingList.Count == 0) 조건을 확인하는 것은 해당 작업이 실행되기 전에 다른 스레드가 pendingList를 수정하지 않았는지 확인하기 위한 안전장치 역할을 합니다. 즉, 이 조건은 새로운 작업을 등록하기 전에 현재 진행 중인 작업들이 완료되었는지를 확인하려고 하는 것입니다.

멀티스레드 환경에서는 한 스레드가 lock을 획득하고 pendingList를 처리하는 동안 다른 스레드들은 대기 상태에 있게 됩니다. 대기 중인 스레드 중 하나가 lock을 획득하면, 이전 작업이 완료되었는지(pendingList.Count == 0)를 확인한 후에 추가 작업을 수행하게 됩니다. 따라서, 이 조건은 멀티스레드 환경에서 예상치 못한 동시성 이슈를 방지하기 위한 중요한 체크 포인트입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

스터디님의 프로필 이미지
스터디

작성한 질문수

질문하기