如何确保已读取所有管道缓冲区?
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 操作状态以上是关于如何确保已读取所有管道缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章