CancelIo()应该取消与调用线程相关的所有挂起的 I/O 操作。根据我的经验,CancelIo() 有时也会取消未来的I/O 操作。鉴于:
ReadFile(port, buffer, length, &bytesTransferred, overlapped);
CancelIo(port)
如果我在读取之前立即调用,GetQueuedCompletionStatus()
将永远阻塞,永远不会收到读取操作。CancelIo(port)
如果我在读取后立即调用,GetQueuedCompletionStatus()
将返回 0GetLastError()==ERROR_OPERATION_ABORTED
- 如果我调用
CancelIo(port)
并且没有挂起或后续读取,GetQueuedCompletionStatus()
将永远阻塞。
这里的关键点是无法检测何时CancelIo()
完成执行。如何确保CancelIo()
已完成执行并且发出进一步的读取请求是安全的?
PS:查看http://osdir.com/ml/lib.boost.asio.user/2008-02/msg00074.html和http://www.boost.org/doc/libs/1_44_0/doc/html/ boost_asio/using.html听起来 CancelIo() 并不是真的可用。必须客户需要 Windows XP 支持。我有哪些选择?
注意:我正在从串行端口读取。