2010-03-21 2 views
7

을 선택 소켓에서 탈옥 .나는 기본적으로 (제한 시간 후)이 몇 초마다 호출하는 루프가

이것은 스레드 B (메인 스레드 아님)에서 실행됩니다. 이 acceptor 루프를 스레드 A (메인 스레드)에서 즉시 끝내고 싶지만 시간 간격이 끝날 때까지 기다려야하는 것처럼 보입니다.

다른 스레드에서 선택 기능을 방해 할 수있는 방법이 있습니까? 스레드 B가 즉시 종료 될 수 있습니까?

+0

Sidenote : if 문을 자르고 while (! finished)을 쓸 수 있습니다. –

+0

100 % CPU 시간이 걸립니다. 확실히 받아 들일 수 없습니다. – kamziro

+0

와우, 내가 잘못 읽었어야합니다 – kamziro

답변

9

가장 쉬운 방법은 을 사용하여 파이프를 만들고 readfds에 읽기 끝을 추가하는 것입니다. 다른 스레드가 select()을 인터럽트하려고하면 바이트를 쓰고 그 다음에 소비합니다.

+0

청취자 소켓 (연결을 허용하는 소켓)입니다. 여전히 작동할까요? 나는 소켓을 파괴하는 어떤 기능을 호출하려고 생각했다. 이게 안전할까요? – kamziro

+1

* a * 파일을 기다리고 있습니다. 그것은 * *, 그냥 * 뭔가 *를 원한다. –

+0

그것이 효과가 있었고 유닉스 파이프로 두 가지를 배웠습니다! 감사! 덧붙여서, 인터럽트가 끝나면 프로그램을 종료합니다. 그래서 나는 소비에 대해 걱정하지 않는다. 괜찮아? – kamziro

3

예, 연결된 소켓 쌍을 만듭니다. 그런 다음 스레드 B가 소켓의 한쪽면에 쓰고 스레드 A가 다른 쪽 소켓을 선택하여 선택합니다. 따라서 B가 소켓 A에 쓰기를 수행하면 select를 종료하고 소켓에서이 바이트를 읽는 것을 잊지 마십시오.

이것은 선택을 인터럽트하는 가장 표준적이고 일반적인 방법입니다.

참고 : 유닉스에서

, 창문 아래에 당신의 코드 샘플을 줄 것 조금 까다 있지만 Windows socketpair에 대한 인터넷 검색을하다, 소켓 쌍을 만드는 데 socketpair를 사용합니다.

+0

아, 방금 파이프 (2)를 사용했는데 작동하는 것 같습니다. . 결국 윈도우 대응에 대해 걱정해야 할 수도 있습니다. – kamziro

-1

시간 제한을 충분히 짧게 할 수는 없습니까 (10ms 정도입니까?).

"그냥 더미 연결을 만듭니다"- 유형 솔루션은 일종의 해킹 된 것 같습니다. 필자는 개인적으로 응용 프로그램이 잘 설계되어 있으면 동시 작업을 강제로 중단 할 필요가 없다고 생각합니다. 작업자 확인이 충분히 자주 수행됩니다 (boost.threads에 종료 기능이없는 이유이기도 함).

편집 답이 CV였습니다. 그것은 나쁘다. 그러나 그것이 왜 나쁜지를 이해하는 데 도움이 될 수있다.

+1

-1 이것은 CPU 비용이 들지만 지연 문제가있는 매우 나쁜 솔루션입니다. 이에 대한 표준 솔루션이 있습니다. – Artyom

+0

그 비용은 CPU가 어떻게됩니까? 더미 소켓 연결을 만드는 것과 비교하여 CPU를 10ms 동안 기다리는 것은 무엇입니까? –

+1

CPU 비용이 시간 초과를 줄이기 때문에 루프가 더 자주 실행됩니다. – caf

-1

주 스레드에서 shutdown (Sock, SHUT_RDWR) 호출을 사용하여 대기 선택 호출에서 빠져 나오면 시간 초과 전에 다른 스레드를 종료하므로 시간 종료가 끝날 때까지 기다릴 필요가 없습니다.

건배. :)

+1

안타깝게도 수신 대기 소켓을 '종료'할 수 없습니다. 그리고 다른 쓰레드가 쓰레드를 사용하고 있거나 쓰고있는 동안 그것을 닫는 안전한 방법은 없다. –

+0

아래에 언급 된 소켓 스레드 기능이 있고 메인 스레드에서 종료 (sock, SHUT_RD)를 전송하면 다른 스레드에서 실행중인 SockThreadFunction에서 대기 선택 호출을 활성화시킵니다. 나는 이것과 그것의 일 벌금을 시도했다. SockThreadFunction() {while (SocketOpen) {// Waiting on Select 호출 int 준비 = 선택 (pSocket-> m_Sock + 1, & SockSet, 0, 0, 0); } –

+0

청취 소켓이 있습니다. 리스닝 소켓을 '종료'할 수 없습니다. 연결된 소켓에서는 작동하지만 리스닝 소켓에서는 작동하지 않습니다. –