如何阻止读取c++字符串流以等待数据
How to block on reading a c++ stringstream to wait for data
因此,我一直在试图弄清楚,如何等待来自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
有什么用处;就在那里我认为更多的原因是正交性。
- 接受函数在发送数据包时等待
- 如何使用 boost::asio 的 async_read_some() 读取所有可用数据,而无需等待新数据到达?
- recvfrom 只收到几个数据包,之后它进入等待状态
- 如何等待 COM 端口上的数据
- 如何将数据写入 stdin,以便由等待来自 stdin 输入的单独线程使用?
- QSslSocket 在等待数据时超时(但 QTcpSocket 不会)
- C 非阻止等待所有RECV数据
- MySQL Windows c api 命名管道错误:"在'等待初始通信数据包'时丢失与 MySQL 服务器的连接,系统错误:0
- 让 pthread 等待另一个数据
- 如何将比较和交换用于任何共享数据结构的免等待互斥
- 如何阻止读取c++字符串流以等待数据
- 等待COM端口上的数据
- 如何等待从套接字接收数据
- 我如何告诉客户端等待,直到它接收到所有的数据
- zmq-cpp:recv() 等待数据,尽管设置了ZMQ_DONTWAIT
- c++ getchar()是否还有数据等待读取
- While循环不等待用户输入(而数据类型无效)
- 使用UNIX套接字,了解如何在发送数据的同时等待数据
- 在Qt中等待数据从串口到达
- SFML TCP 套接字不等待数据