아래의 예제 코드를 고려해보십시오 (오류가 발생해도 오류가 발생하는 경우 신속하게 입력했습니다. 이론에 관심이 있습니다).recv가 차단되면 어떻게 올바르게 정리할 수 있습니까?
bool shutDown = false; //global
int main()
{
CreateThread(NULL, 0, &MessengerLoop, NULL, 0, NULL);
//do other programmy stuff...
}
DWORD WINAPI MessengerLoop(LPVOID lpParam)
{
zmq::context_t context(1);
zmq::socket_t socket (context, ZMQ_SUB);
socket.connect("tcp://localhost:5556");
socket.setsockopt(ZMQ_SUBSCRIBE, "10001 ", 6);
while(!shutDown)
{
zmq_msg_t getMessage;
zmq_msg_init(&getMessage);
zmq_msg_recv (&getMessage, socket, 0); //This line will wait forever for a message
processMessage(getMessage);
}
}
들어오는 메시지를 기다리고 적절히 처리하기위한 스레드가 만들어집니다. 스레드는 shutDown
이 true로 설정 될 때까지 루핑됩니다.
ZeroMQ에서 Guide은 무엇을 정리해야하는지, 즉 메시지, 소켓 및 컨텍스트를 명시합니다.
내 문제는 : recv
이 메시지를 영원히 기다리고 스레드를 차단하므로 메시지를받지 못하면 어떻게 안전하게이 스레드를 종료 할 수 있습니까?
'zmq_msg_recv'에서'ZMQ_DONTWAIT' 플래그를 사용하고 짧은 시간 동안 매뉴얼'Sleep'을 추가하십시오? 더 많은 폴링 방법을 사용 하시겠습니까? –
zmg_ * API에 대해 모르겠지만 일반 소켓 API에서는 다른 스레드에서 소켓을 닫으면 충분하며 recv는 실패로 종료됩니다. 이렇게하려면 다른 스레드의 소켓에 연결하여'socket' 변수를 닫을 수 있어야합니다. 'MessengerLoop'은 무한'recv' 루프 만 포함해야합니다. –
@AlexFarber 필자는 실수로 생각하지 않는다면 동일한 MessengerLoop 스레드에서 모든 메시지 처리가 수행되지 않을 것이라고 생각 했었습니까?어떤 경우에는 "나는 메시지를 기다리고있어 네가 나를 해산시킬 수있다"와 "나는 뭔가를 처리하는 데 바쁘다. 아직 나를 끝내지 말자."를 구별하는 신호 시스템을 설치해야한다. 이것은 Polling 기반 시스템보다 난해하게 보인다. 나는 말라 키 메시징을하는이 네트워크 메시징에 익숙하지 않다. 나는 뭔가를 놓치고 있는가? – Ian