如何阻止读取c++字符串流以等待数据

How to block on reading a c++ stringstream to wait for data

本文关键字:等待 数据 字符串 何阻止 读取 c++      更新时间:2023-10-16

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

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

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

提前感谢您对这个主题的任何介绍。

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

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

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

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

然而,真正的问题是,你试图实现什么。std::stringstream在过程中运行,在这种情况下实际上不需要格式化(这是iostream的抽象一般而言)。只需将原始对象填充到std::deque中即可。唯一您应该在通信时担心格式问题与外部。CCD_ 14是非常有用的,当您从文件上的std::getline或其他来源。类似地,std::ostringstream在格式化某些外部源的数据,该外部源需要一些排序。但我从未发现std::stringstream有什么用处;就在那里我认为更多的原因是正交性。