2012-09-04 4 views
0

차단을 선택 나는이 문제를 건너 왔어요 다른 스레드에서., 여전히

같은 스레드에서 클라이언트 소켓에서 FD_SET을 호출하면 모든 것이 예상대로 작동합니다. 그러나 다른 스레드에서 호출하면 아무 것도 수행하지 않고 select는 클라이언트에서 데이터를받을 때까지 대기합니다.

답변

2

물론 하나의 스레드에서 데이터를 수정할 수 없으며 적절한 동기화를 거치지 않고 다른 스레드에서 수정할 수 있습니다. select은 호출되었을 때 즉시 fd_set을 읽은 다음 다시 보지 않습니다. 그러나 상관없이 select이 이미 호출 된 경우 필요한 동기화를 얻을 수있는 방법이 없습니다. 디자인을 재고해야합니다. 한 가지 해결책은 "자체 파이프"트릭입니다. 파이프를 열어서 select이 항상 입력을 찾고 다른 스레드가 파이프를 통해 메시지를 보내어 대기중인 메시지를 모두 취소하고 select을 취소하고 select 스레드를 가져 와서 테이블을 다시 스캔합니다. (적당한 동기화와 함께)보고 있어야하고 자신의 fd_set을 업데이트해야합니다.