을 선택 소켓에서 탈옥 .나는 기본적으로 (제한 시간 후)이 몇 초마다 호출하는 루프가
이것은 스레드 B (메인 스레드 아님)에서 실행됩니다. 이 acceptor 루프를 스레드 A (메인 스레드)에서 즉시 끝내고 싶지만 시간 간격이 끝날 때까지 기다려야하는 것처럼 보입니다.
다른 스레드에서 선택 기능을 방해 할 수있는 방법이 있습니까? 스레드 B가 즉시 종료 될 수 있습니까?
을 선택 소켓에서 탈옥 .나는 기본적으로 (제한 시간 후)이 몇 초마다 호출하는 루프가
이것은 스레드 B (메인 스레드 아님)에서 실행됩니다. 이 acceptor 루프를 스레드 A (메인 스레드)에서 즉시 끝내고 싶지만 시간 간격이 끝날 때까지 기다려야하는 것처럼 보입니다.
다른 스레드에서 선택 기능을 방해 할 수있는 방법이 있습니까? 스레드 B가 즉시 종료 될 수 있습니까?
가장 쉬운 방법은 을 사용하여 파이프를 만들고 readfds
에 읽기 끝을 추가하는 것입니다. 다른 스레드가 select()
을 인터럽트하려고하면 바이트를 쓰고 그 다음에 소비합니다.
예, 연결된 소켓 쌍을 만듭니다. 그런 다음 스레드 B가 소켓의 한쪽면에 쓰고 스레드 A가 다른 쪽 소켓을 선택하여 선택합니다. 따라서 B가 소켓 A에 쓰기를 수행하면 select를 종료하고 소켓에서이 바이트를 읽는 것을 잊지 마십시오.
이것은 선택을 인터럽트하는 가장 표준적이고 일반적인 방법입니다.
참고 : 유닉스에서
, 창문 아래에 당신의 코드 샘플을 줄 것 조금 까다 있지만 Windows socketpair
에 대한 인터넷 검색을하다, 소켓 쌍을 만드는 데 socketpair
를 사용합니다.
아, 방금 파이프 (2)를 사용했는데 작동하는 것 같습니다. . 결국 윈도우 대응에 대해 걱정해야 할 수도 있습니다. – kamziro
시간 제한을 충분히 짧게 할 수는 없습니까 (10ms 정도입니까?).
"그냥 더미 연결을 만듭니다"- 유형 솔루션은 일종의 해킹 된 것 같습니다. 필자는 개인적으로 응용 프로그램이 잘 설계되어 있으면 동시 작업을 강제로 중단 할 필요가 없다고 생각합니다. 작업자 확인이 충분히 자주 수행됩니다 (boost.threads에 종료 기능이없는 이유이기도 함).
편집 답이 CV였습니다. 그것은 나쁘다. 그러나 그것이 왜 나쁜지를 이해하는 데 도움이 될 수있다.
주 스레드에서 shutdown (Sock, SHUT_RDWR) 호출을 사용하여 대기 선택 호출에서 빠져 나오면 시간 초과 전에 다른 스레드를 종료하므로 시간 종료가 끝날 때까지 기다릴 필요가 없습니다.
건배. :)
안타깝게도 수신 대기 소켓을 '종료'할 수 없습니다. 그리고 다른 쓰레드가 쓰레드를 사용하고 있거나 쓰고있는 동안 그것을 닫는 안전한 방법은 없다. –
아래에 언급 된 소켓 스레드 기능이 있고 메인 스레드에서 종료 (sock, SHUT_RD)를 전송하면 다른 스레드에서 실행중인 SockThreadFunction에서 대기 선택 호출을 활성화시킵니다. 나는 이것과 그것의 일 벌금을 시도했다. SockThreadFunction() {while (SocketOpen) {// Waiting on Select 호출 int 준비 = 선택 (pSocket-> m_Sock + 1, & SockSet, 0, 0, 0); } –
청취 소켓이 있습니다. 리스닝 소켓을 '종료'할 수 없습니다. 연결된 소켓에서는 작동하지만 리스닝 소켓에서는 작동하지 않습니다. –
Sidenote : if 문을 자르고 while (! finished)을 쓸 수 있습니다. –
100 % CPU 시간이 걸립니다. 확실히 받아 들일 수 없습니다. – kamziro
와우, 내가 잘못 읽었어야합니다 – kamziro