해결된 질문
작성
·
31
·
수정됨
0
IOCP 서버를 클래스로 만들어 보려고 하고 있습니다.
Thread 생성까지 오류 없이 되다가 Client가 접속되면 문제가 발생합니다.
디버깅 결과 client_list는 메모리 할당이 되었으며 clientSocket이 정상적으로 도착한 상태입니다.
하지만 위의 사진과 같이 push_back을 하려고하면 오류가 발생합니다.
해당 쓰레드의 함수는 class 내부의 메소드로 정의 및 구현되어있습니다.
socket_list와 socket_cs를 class 외부에서 정의했을 때에도 같은 현상이 발생합니다.
참고할만한 레퍼런스나 해결법이 있을까요?
답변 2
0
애석하지만...부분적인 코드만 봐서는 해결할 수가 없습니다. 다만 리스트에 데이터 추가 시 에러가 나는 것으로 볼 때 크리티컬 섹션을 이용한 동기화가 실패한 것은 아닌지 모르겠습니다. 크리티컬 섹션과 관련해 초기화가 제대로 된 것인지 다시 확인해보실 것을 권합니다. 😄
0
안녕하세요, 인프런 AI 인턴입니다. 박주현 님의 질문에 대해 답변 드리도록 하겠습니다.
현재 IOCP 서버를 개발하는 과정에서 클라이언트가 접속될 때 std::list
의 push_back
메서드를 호출하면서 액세스 위반 오류가 발생한 상황입니다. 이 문제는 주로 메모리 액세스 위반과 관련되며, 다음과 같은 이유로 발생할 가능성이 있습니다.
메모리 영역의 초기화 문제: client_list
의 초기화가 정상적으로 이루어지지 않았을 수 있습니다. 클래스의 생성자에서 제대로 할당되었는지 확인해 보세요.
다중 스레드 문제: 클라이언트 소켓 리스트에 접근하는 부분에서 동기화 문제가 발생할 수 있습니다. 여러 스레드에서 동시에 리스트에 접근할 때, 뮤텍스(Mutex) 같은 동기화 개체를 사용하여 보호해야 합니다.
잘못된 포인터 참조: 리스트에 추가하려는 소켓 객체가 유효한지, 그리고 이 객체에 대한 올바른 포인터를 사용하고 있는지 확인하세요.
비슷한 상황에 대한 도움을 줄 수 있는 유사한 질문과 답변이 있습니다:
CreateThread()
를 사용해 클래스 멤버 함수를 실행하는 과정에서의 주의사항과 관련된 정보가 포함되어 있습니다. 스레드 안전성 및 올바른 함수 호출 규칙이 다뤄지고 있습니다.해당 문제 해결을 위해서는, 클라이언트 소켓 리스트 접근 시 동기화 메커니즘을 사용하여 접근을 제어하거나, std::mutex
를 활용해 리스트의 동기화를 보장하는 방식으로 접근하면 좋습니다. 문제의 발생 지점에 따라 이와 같은 동기화 처리를 우선 검토해 보시길 권유 드립니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.