Как я могу отменить блокирующий вызов, такой как select () или read ()? - PullRequest
2 голосов
/ 11 августа 2011

Как видно из заголовка, как я могу отменить блокирующий вызов, такой как select () или (в случае последовательной связи и аналогичных) read () из другого потока? Каков традиционный способ решения таких вещей? Я полагаю, что можно использовать небольшой тайм-аут, и это, вероятно, будет работать нормально, но мне это кажется чем-то вроде взлома.

Ответы [ 2 ]

3 голосов
/ 11 августа 2011

Традиционный способ прерывания select(2) - это self-pipe trick. Вызовы ввода / вывода лучше обслуживаются наличием дескрипторов неблокирующих и обработкой EAGAIN.

0 голосов
/ 11 августа 2011

В этих ситуациях вам, вероятно, следует использовать небольшой или немедленный тайм-аут и иметь дополнительную логику, которая обрабатывает, когда / как / почему предпринята следующая попытка выбора / чтения.

...