5

所以,我一直在试图弄清楚,如何等待来自 C++ 字符串流的数据(例如),而不是不断检查数据是否存在,这非常消耗 CPU。

例如,我完全能够从串行设备读取数据,并在没有数据到达时锁定进程,但不幸的是,我无法弄清楚如何使用 C++ 流来做到这一点。

我确定我遗漏了一些东西,因为 cin 正是这样做的,即等待返回键退出 istream 读取,但它是如何做到的呢?

提前感谢您对这个主题的任何了解。

4

2 回答 2

3

流从std::streambuf. 对于这种情况,std::cin它调用系统的read()函数(或等效函数),该函数会阻塞,直到数据从操作系统移交。控制台通常会发送完整的行。字符串流没有获取新数据的概念,即当到达当前数据的末尾时它们会失败。没有阻塞的概念。

您并没有完全说出您在做什么,但从它的声音来看,它尝试在两个线程之间传递数据:一个读取并可能阻塞直到数据可用,另一个填充更多数据。您可以很容易地创建相应的流缓冲区:如果没有数据,std::streambuf::underflow()将在条件变量上。将适当地设置缓冲区并向条件变量发出信号。显然,有一些必要的同步。但是,大多数读写都没有进行任何同步。这实际上意味着您将需要两个单独的缓冲区用于输入和输出,并且需要将数据复制到.wait()std::streambuf::overflow()std::streambuf::underflow()

于 2012-09-10T12:13:30.563 回答
1

你不能。唯一std::stringstream可以知道没有任何进一步数据的方法是流中没有任何数据。

然而,这是一个有趣的想法。 <<仅当std::stringstream 写入端已关闭时才返回 true。这个想法的唯一问题是std::stringstream没有任何打开或关闭的想法。

然而,真正的问题是你想要达到的目标。 std::stringstream在进程中运行,在这种情况下,实际上不需要格式化(通常是 iostream 的抽象)。只需将原始对象填充到std::deque. 唯一需要担心格式的时候是与外部通信时。 std::istringstream非常有用,例如,当您从std::getline文件或其他来源获取字符串时。同样,std::ostringstream在为某些需要某种字符串的外部源格式化数据时很有用。但我从来没有找到使用std::stringstream; 我认为,还有更多是出于正交性的原因。

于 2012-09-10T12:13:00.987 回答