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

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

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

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

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

【问题讨论】:

  • 根据上下文,等到两个线程都退出后再关闭句柄可能更明智。

标签: c++ multithreading winapi


【解决方案1】:

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

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

【讨论】:

  • 我已经在使用这个解决方案了,但我认为有一些内部机制可以检查管道 I/O 操作状态
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
相关资源
最近更新 更多