2010-01-15 4 views

ответ

5

Нет, это не возможно. Если вы хотите узнать, есть ли данные для чтения, используйте select() syscall - если вы только читаете, когда есть данные, вы никогда не будете блокировать

+0

select(), к сожалению, не является частью стандартного C++ и не будет работать с объектами потока C++. – 2010-01-15 17:14:02

+0

Тем более не рекомендуется использовать объекты потока C++. –

+1

Тем не менее, причина не в использовании C++ :) –

0

Возможно, попробуйте метод istream::readsome(). Он не дожидается устройства и только читает, что находится в буфере буферизованного потока.

+0

Ни одна из функций потока не ждет устройства. Тем не менее, все основные библиотеки. readsome() не решит проблему. – 2010-01-15 17:48:07

0

peek объект istream.

Другим способом является наличие отдельного потока, постоянно ожидающего ввода на консоль и помещения данных в очередь или буфер. Интерфейс с буфером зависит от вас, вы можете сделать его блокировкой, неблокированием или таймаутом (или всеми тремя).

0

Поскольку было сказано, что это невозможно, я думаю, что это должно быть здорово, хотя и дать некоторые альтернативы.

Обычно я использую код сервера, и мы имеем ту же проблему с синхронными вызовами (заблокированными) в базе данных. Иногда (по какой-либо причине) вызов может не возвращаться достаточно быстро, и у вас есть ограниченное время для обработки.

Решение, которое мы приняли довольно прост, и включает в себя MT конечно:

  • При получении запроса, запустить таймер, который будет вызывать функцию обратного вызова при завершении
  • Если вы успешно завершена, отключите таймер, он не нужен сейчас.
  • Выполняйте свою обработку, и после каждого «заблокированного» вызова проверьте таймер (также через другие регулярные промежутки времени): если он был уволен, вы слишком долго и должны отказаться от обработки и вернуться со всей поспешностью. Другой поток теперь отвечает за запрос, поскольку вы слишком долго.
  • Когда таймер срабатывает, запустите новый поток с обратным вызовом, этот метод должен отвечать «наилучшим образом» и должен воздерживаться от использования заблокированных вызовов. Он может использовать спецификацию, используемую другой нитью, если указанная спецификация правильно управляет MT (блокировка и т. Д.)

В качестве привычки мы устанавливаем таймер в удобную зону между 75% и 95% максимальное время, разрешенное для обработки запроса (настроено по категориям запросов).

Это позволяет вам аккуратно избегать блокирующих вызовов. Если вы не хотите правильно синхронизировать свою спецификацию (поскольку она связана с накладными расходами), ответ «наилучшего усилия» может быть простым сообщением о повторении (это 95%). Если у вас есть очистка или другой способ (кеш?), Чтобы ответить, вам потребуется синхронизация в части спецификации по крайней мере (это 75%).

Смежные вопросы