Как следует из названия, как я могу отменить блокирующий вызов, такой как select() или (в случае последовательной связи и т.п.) read() из другого потока? Каков традиционный способ решения подобных проблем? Я полагаю, что можно было бы использовать небольшой тайм-аут, и это, вероятно, сработало бы нормально, но мне это кажется чем-то вроде взлома.
Как я могу отменить блокирующий вызов, такой как select() или read()?
comment
Отмены нет. Есть только тайм-аут и решение, повторять или нет.
- person wberry   schedule 11.08.2011
Ответы (2)
Традиционным способом прерывания select(2)
является self-pipe trick
. Вызовы ввода-вывода лучше обслуживаются при наличии дескрипторов неблокирующих и обработке EAGAIN
.
person
Nikolai Fetissov
schedule
10.08.2011
В этих ситуациях вам, вероятно, следует использовать небольшой или немедленный тайм-аут и иметь дополнительную логику, которая обрабатывает, когда/как/почему делается следующая попытка выбора/чтения.
person
Colin
schedule
10.08.2011