C++의 Windows에서 스레드 동기화와 관련된 디자인 문제가 있습니다.모든 활성 스레드에 신호 보내기 (Windows)
스레드를 수신하는 서버 응용 프로그램을 작성 중입니다. 서버가 작동하는 동안 항상 활성 상태를 유지해야합니다. 청취 스레드가 을 연결하면 요청을 연결하고 CONTROL 소켓을 열고 제어 스레드를 새로 시작합니다. 이 스레드는 서버와 클라이언트간에 제어 데이터를 보내고 서버와 모든 백그라운드 소프트웨어를 특정 클라이언트 데이터로 초기화하고 데이터 처리를 시작하는 데 사용됩니다.
제어 소켓을 통한 초기화가 성공하면 제어 스레드는 새로운 소켓 인 DATA 소켓을 열어 서버에서 클라이언트로 데이터를 전달합니다. 또한이 새로운 DATA 소켓으로 보내는 두 개의 새 스레드와 CONTROL 소켓에서 수신중인 다른 스레드를 시작하여 클라이언트가 연결을 종료하려고 할 때까지 기다립니다.
클라이언트가 연결을 닫습니다 비정상적으로, 서버 메시지를 보내는 함수를 호출하지 않고 응용 프로그램을 종료하여 연결을 종료 할 때, 여기에서 발생해야하는 것입니다 :
- 는 실행의 스레드의 상관이 이벤트를 감지 할 수 있습니다 . 그들은 DATA/CONTROL 소켓에서 송수신하는 동안 어떤 종류의 에러 (WSAECONNRESET)를 받게 될 것이고, 서버 리스닝 스레드를 제외하고는 실행을 멈춰야하는 다른 모든 스레드에 신호를 보내야한다.
이러한 유형의 동작을 달성하는 가장 자연스러운 방법은 무엇입니까?
를 사용하여 멀티 스레드 윈속 서버를 작성하는 경우, 당신은에보고해야한다
많은 스레드를 사용하고있는 것 같습니다. – Steve
이것이 어떻게 우아하게 변경 될지에 대한 건설적인 의견을 환영합니다. 이것은 내 첫 번째 멀티 스레드 응용 프로그램이며 이러한 종류의 문제를 처리하는 일반적인 방법에 익숙하지 않습니다.원래 아이디어의 개선에 대한 아이디어를 게시 하시겠습니까? 서버가 데이터와 제어 소켓을 통해 동시에 전송할 수 있어야합니다. 이것을 2 개의 쓰레드로 분리하지 않으면 어떻게 할 수 있습니까? 또한 recv 및 send 함수는 블로킹 동작을 exibit합니다. 그래서이 것을 두 개의 스레드 (하나는 수신, 다른 하나는 소켓으로 보내는)로 분리하기로 결정한 것입니다. – construKction
@construKction : WSAWaitForMultipleEvents를 참조하십시오. 'recv'는 당신이 이미 "data available"이벤트를 기다리고 있다면 블로킹하지 않습니다. – MSalters