Итак, я пытался выяснить, как ждать данные из строкового потока C ++ (например), без постоянной проверки наличия данных, что довольно сильно потребляет процессор.
Я прекрасно умею читать, например, с последовательного устройства и блокировать процесс, пока данные не поступают, но, к сожалению, я не смог понять, как это сделать с потоками C ++.
Я уверен, что что-то упустил, так как cin делает именно это, то есть ждет, когда ключ возврата выйдет из чтения istream, но как он это делает?
Заранее спасибо за любой свет на эту тему.
Потоки получают данные из std::streambuf
, Для случая std::cin
это вызывает систему read()
функция (или эквивалент), которая блокирует, пока данные не будут переданы из операционной системы. Консоль обычно отправляет полные строки. Строковые потоки не имеют понятия получения новых данных, то есть они потерпят неудачу, когда достигнут конец текущих данных. Там нет концепции блокировки.
Вы не совсем поняли, что делаете, но по звукам этого пытаетесь передать данные между двумя потоками: одно чтение и, возможно, блокирование, пока данные не будут доступны, а другое заполняет больше данных. Вы можете легко создать соответствующий буфер потока: std::streambuf::underflow()
было бы wait()
на условную переменную, если нет данных. std::streambuf::overflow()
настроит буфер соответствующим образом и сообщит переменную условия. Очевидно, что необходима синхронизация. Однако большая часть чтения и записи не выполняет никакой синхронизации. Это фактически означает, что вам понадобятся два отдельных буфера для ввода и вывода и вам нужно скопировать данные в std::streambuf::underflow()
,
Ты не можешь Единственный способ std::stringstream
может знать, что нет
любые дальнейшие данные в том, что в потоке нет никаких данных.
Это интересная мысль, однако. <<
на std::stringstream
возвращает true, только если сторона записи была закрыта. Единственная проблема
с мыслью, что std::stringstream
не имеет никакого представления об открытом
или закрыто.
Однако реальный вопрос в том, чего вы пытаетесь достичь.
std::stringstream
работает в процессе, и в этом случае, есть
действительно нет необходимости в форматировании (это абстракция iostreams
в общем). Просто набейте сырые предметы в std::deque
, Единственный
время, когда вам нужно беспокоиться о форматировании, это при общении
с экстерьером. std::istringstream
очень полезно, например,
когда вы получаете строку из std::getline
в файле или из
какой-то другой источник. Так же, std::ostringstream
полезно когда
форматирование данных для некоторого внешнего источника, для которого требуется строка
Сортировать. Но я никогда не нашел применения для std::stringstream
; Это здесь
больше по соображениям ортогональности, я думаю.