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

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


person Emil Eriksson    schedule 10.08.2011    source источник
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