如何确保已读取所有管道缓冲区?

Posted

技术标签:

【中文标题】如何确保已读取所有管道缓冲区?【英文标题】:How to ensure all pipe buffer has been read? 【发布时间】:2015-04-02 11:07:04 【问题描述】:

我在 Windows 上有一个应用程序,它有两个线程:

First one - 正在从一些外部存储读取信息并通过WriteFile 将其写入管道

Second one - 正在使用ReadFile从管道中读取信息并对其进行一些操作。

我正在使用通过CreatePipe 创建的常用匿名管道。所以我的问题是 - 当我关闭写入线程中的管道时,有时读取线程还没有完成读取,这导致管道损坏。那么如何确保在关闭管道之前已读取所有书面信息?

【问题讨论】:

根据上下文,等到两个线程都退出后再关闭句柄可能更明智。 【参考方案1】:

你可以在关闭管道之前尝试FlushFileBuffers()

另一种选择是使用CreateEvent() 创建两个事件对象。当写入线程完成写入时,使用SetEvent() 发出第一个事件信号,并等待使用WaitForSingleObject() 发出第二个事件信号,然后关闭管道(或写入下一个数据块)。当读取线程检测到第一个事件已发出信号时,从管道中读取直到没有可读取的内容,然后使用SetEvent() 发出第二个事件。

【讨论】:

我已经在使用这个解决方案了,但我认为有一些内部机制可以检查管道 I/O 操作状态

以上是关于如何确保已读取所有管道缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

如果管道已满,写入管道的进程是不是会阻塞?

如何限制管道(windows)的缓冲区大小?

Linux-C:从管道读取返回写入它的第一个缓冲区

java.io.PipedInputStream

如何测试输出到 std::cout (连接到管道)是不是会阻塞

命名管道,如何知道在读取端读取的确切字节数。 C++, 视窗