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

박성용님의 프로필 이미지
박성용

작성한 질문수

Windows 소켓 프로그래밍 입문에서 고성능 서버까지!

CreateThread()를 사용하여 클래스의 멤버함수를 실행할 수 는 없나요?

해결된 질문

작성

·

428

0

수업을 듣고 따로 서버코드를 만들어 보려는 중 잘 안돼서 질문 드립니다.

class Server {
	private:
		SOCKET listenSocket;
		std::list<SOCKET> listClients;
		SOCKADDR_IN serverAddr;
	public:
		Server();
		Server(USHORT port, IN_ADDR addr);
		void Bind();
		void Listen();
		DWORD WINAPI ThreadAcceptLoop(LPVOID pParam);
		void AcceptClient();
		void ReleaseServer();
		~Server();
};

main 함수에서 Server클래스의 객체를 만들어서 서버를 실행하는 로직을 구현하고 있습니다.

Server클래스의 AccpetClient()에서 CraeteThread()를 사용하여 ThreadAcceptLoop()를 실행하는 쓰레드를 만들어서 클라이언트의 요청을 Accept()하려고 합니다.

하지만 CreateThread()함수에서 E0167 DWORD (__stdcall Server::*)(LPVOID pParam) 형식의 인수가 LPTHREAD_START_ROUTINE 형식의 매개 변수와 호환되지 않습니다. 라는 오류와 함께 컴파일이 되지 않습니다.

찾아본 결과 함수를 static으로 선언하던지 전역함수를 사용하라고 합니다.

제가 하려던것처럼 클래스의 멤버함수를 실행할 수는 없나요??

답변 2

1

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

윈도우 환경에서 클래스 멤버의 함수 호출 규칙은 __stdcall이 아니라 thiscall입니다. 따라서 CreateThread() 함수가 요구하는 규칙에 맞지가 않습니다. 이 문제를 해결하는 방법은...

  1. 클래스의 정적 멤버로 선언하거나

  2. 별도 전역 함수로 선언 하는 것


    입니다.

결과는 이미 알아본 내용 그대로 입니다. 다른 방법은 없습니다. 참고하시기 바랍니다. :)

1

accept()를 스레드 만들어서 돌리시려는 이유가 있을까요?

https://stackoverflow.com/questions/10673585/start-thread-with-member-function

C++ thread 클래스 사용하면 멤버 함수를 멀티스레딩으로 돌릴 수 있는 것 같긴 하지만 괜찮은 사용인지는 의문입니다.

강의 내용 처럼 메인 스레드에서는 클라이언트 연결을 받고 그 클라이언트에 대한 처리를 멀티스레드로 돌리는 구조가 더 괜찮아 보입니다.

박성용님의 프로필 이미지
박성용

작성한 질문수

질문하기