• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

안녕하세요 루키스님. 클라 연동에 관해서 질문을 드리고 싶습니다.

23.07.20 01:45 작성 조회수 278

1

안녕하세요 루키스님.

제가 비쥬얼 스튜디오에서 윈도우 어플리케이션을 만들어서 DX11포폴을 만들고 서버를 연동하려고 시도중입니다. 이 상황에서 wWinMain에

    ClientServiceRef service = MakeShared<ClientService>(
        NetAddress(L"127.0.0.1", 7777),
        MakeShared<IocpCore>(),
        MakeShared<ServerSession>, // TODO : SessionManager 등
        1);

    ASSERT_CRASH(service->Start());

    GThreadManager->SetFlags(1);
    for (int32 i = 0; i < 2; i++)
    {
        GThreadManager->Launch([=]()
        {
            while (true)
            {
                service->GetIocpCore()->Dispatch(10);
            }
        });
    }

    //밑은 DX11을 작동시켜주기 위한 함수들입니다.
    while (true)
    {
        if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
        {
            if (WM_QUIT == msg.message)
                break;

            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }

        else
        {
            CEngine::GetInst()->progress();

            CEditorObjMgr::GetInst()->progress();

            ImGuiMgr::GetInst()->progress();

            // 렌더 종료
            CDevice::GetInst()->Present();
        }       
    }

이렇게 쓰레드를 생성해서 작동을 시켜주었습니다.
그런데 생성된 게임 윈도우에서 X키를 눌러서 프로그램을 강제로 종료시켰는데, 이 메인 쓰레드 자체는 정상적으로 WM_DESTROY를 호출 받아서 종료되었는데, 멀티 쓰레드들이 멈추지 않고 계속 돌아 프로그램이 종료되지 않고, 좀비처럼 살아남는 현상이 계속되고 있습니다.

쓰레드를 강제로 종료시키니 메모리 릭이 남고, 어떻게 문제를 해결해야할지 해결책을 찾지 못해서 이렇게 질문 남깁니다.

참고) 루키스님의 패킷 직렬화#3 코드를 참조해서 만들고 있습니다!
감사합니다.

답변 1

답변을 작성해보세요.

0

1) 어차피 프로그램이 종료되는데, 강종으로 인해 메모리 릭이 일어나는건 전혀 문제 상황이 아닙니다.
2) 멀티쓰레드들이 멈추지 않는 이유는 멈춘 적이 없기 때문입니다. 메인 쓰레드에서 항상 Join을 하지 않고 모두가 알 수 있는 bool flag 하나를 두고 그 값에 따라 다른 쓰레드들도 종료하게 만들면 됩니다. 근데 굳이? 그렇게까지 처리할 생각이 없으면 Join을 제거하고 그냥 강종해도 무방합니다. 실제 프로젝트에서도 어차피 서버를 끄는 마당에 그렇게 메모리 '릭'을 신경 쓰는 경운 없습니다.

가랑눈님의 프로필

가랑눈

질문자

2023.07.20

아 감사합니다! 강종해서 생기는 메모리 릭은 전혀 문제상황이 아니군요! 감사합니다.