Можно ли заставить поток возвратиться от вызова к функции блокировки, такой как блокировка, считанная из потока?как вернуться из заблокированного вызова?
int x;
std::cin >> x;
, например ...
Можно ли заставить поток возвратиться от вызова к функции блокировки, такой как блокировка, считанная из потока?как вернуться из заблокированного вызова?
int x;
std::cin >> x;
, например ...
Нет, это не возможно. Если вы хотите узнать, есть ли данные для чтения, используйте select() syscall - если вы только читаете, когда есть данные, вы никогда не будете блокировать
Возможно, попробуйте метод istream::readsome()
. Он не дожидается устройства и только читает, что находится в буфере буферизованного потока.
Ни одна из функций потока не ждет устройства. Тем не менее, все основные библиотеки. readsome() не решит проблему. – 2010-01-15 17:48:07
peek объект istream.
Другим способом является наличие отдельного потока, постоянно ожидающего ввода на консоль и помещения данных в очередь или буфер. Интерфейс с буфером зависит от вас, вы можете сделать его блокировкой, неблокированием или таймаутом (или всеми тремя).
Поскольку было сказано, что это невозможно, я думаю, что это должно быть здорово, хотя и дать некоторые альтернативы.
Обычно я использую код сервера, и мы имеем ту же проблему с синхронными вызовами (заблокированными) в базе данных. Иногда (по какой-либо причине) вызов может не возвращаться достаточно быстро, и у вас есть ограниченное время для обработки.
Решение, которое мы приняли довольно прост, и включает в себя MT конечно:
В качестве привычки мы устанавливаем таймер в удобную зону между 75% и 95% максимальное время, разрешенное для обработки запроса (настроено по категориям запросов).
Это позволяет вам аккуратно избегать блокирующих вызовов. Если вы не хотите правильно синхронизировать свою спецификацию (поскольку она связана с накладными расходами), ответ «наилучшего усилия» может быть простым сообщением о повторении (это 95%). Если у вас есть очистка или другой способ (кеш?), Чтобы ответить, вам потребуется синхронизация в части спецификации по крайней мере (это 75%).
select(), к сожалению, не является частью стандартного C++ и не будет работать с объектами потока C++. – 2010-01-15 17:14:02
Тем более не рекомендуется использовать объекты потока C++. –
Тем не менее, причина не в использовании C++ :) –