【问题标题】:How to implement asynchronous write in c/c++?如何在 C/C++ 中实现异步写入?
【发布时间】:2010-09-09 01:59:13
【问题描述】:
WriteFile( tmp_pipe, &Time, sizeof(double), &dwWritten, NULL );

上面是同步的,如果tmp_pipe的buffer用完了,就会在那里等。

如何让上面的操作立即完成,如果缓冲区满了就忽略数据?

【问题讨论】:

标签: c++ windows winapi


【解决方案1】:

确定的方法是使用boost::asio

如果您不使用好的库,异步 IO 很难获得正确和可移植性。

【讨论】:

  • 为什么你认为很难做到正确?我认为我从来没有犯过错误,即使是最初的几次。
  • 天哪,你是我公司这些年来一直在寻找的神话般的完美程序员。 :P
【解决方案2】:

如果您不需要可移植代码,那么直接使用 Win32 就可以了。

如果您将 OVERLAPPED 结构的地址指定为最后一个参数,那么稍后您将通过该 OVERLAPPED 结构获得有关异步写入的信息。您需要以重叠模式打开文件。或者,您可以使用 WriteFileEx 并提供完成回调。阅读MSDN docs了解更多详情。

请注意,您仍然必须明智地处理管道上存在未完成 I/O 的情况。没有办法只进行“即发即弃”写入,忽略管道具有有限带宽的事实。最终你会遇到一些内核缓冲池限制,I/O 会失败,可能会破坏你的管道,直到它重新启动。

这很难做到,但网上有很多示例可以提供帮助。如需额外积分,请使用 I/O 完成端口,它为用户模式 ​​Windows 上的异步 I/O 提供最高性能。不是 100% 确定这适用于管道,但肯定适用于套接字和文件。

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2011-02-01
  • 1970-01-01
  • 2011-09-02
  • 2011-05-28
相关资源
最近更新 更多