所以,我一直在试图弄清楚,如何等待来自 C++ 字符串流的数据(例如),而不是不断检查数据是否存在,这非常消耗 CPU。
例如,我完全能够从串行设备读取数据,并在没有数据到达时锁定进程,但不幸的是,我无法弄清楚如何使用 C++ 流来做到这一点。
我确定我遗漏了一些东西,因为 cin 正是这样做的,即等待返回键退出 istream 读取,但它是如何做到的呢?
提前感谢您对这个主题的任何了解。
所以,我一直在试图弄清楚,如何等待来自 C++ 字符串流的数据(例如),而不是不断检查数据是否存在,这非常消耗 CPU。
例如,我完全能够从串行设备读取数据,并在没有数据到达时锁定进程,但不幸的是,我无法弄清楚如何使用 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
在进程中运行,在这种情况下,实际上不需要格式化(通常是 iostream 的抽象)。只需将原始对象填充到std::deque
. 唯一需要担心格式的时候是与外部通信时。 std::istringstream
非常有用,例如,当您从std::getline
文件或其他来源获取字符串时。同样,std::ostringstream
在为某些需要某种字符串的外部源格式化数据时很有用。但我从来没有找到使用std::stringstream
; 我认为,还有更多是出于正交性的原因。