【发布时间】:2020-02-17 08:46:42
【问题描述】:
尝试通过命名管道在单个服务器和单个客户端之间进行读取和写入,而不使用重叠模式。 正在运行两个线程分别进行读取和写入。根据文档,我的理解是,单个连接将同时具有输入和输出缓冲区。所以我应该能够使用单个管道实例并行读写。 编写了一个简单的测试代码,以循环方式从服务器写入客户端。服务器上的读取线程调用 ReadFile 的那一刻,写入线程卡在 WriteFile 上。有人可以解释这种情况下的行为吗?
Documentation 表示“在管道客户端启动之前,管道服务器不应执行阻塞读取操作”。但是阻塞ReadFile是在客户端开始从写线程接收数据之后完成的。
更新 1:我知道 ReadFile 在这里阻止了 WriteFile。但我正在寻找 Microsoft 的文档来解释这种行为。任何链接都将不胜感激。
【问题讨论】:
-
不确定是否重复,但stackoverflow.com/questions/8069172/… 可能是相关的。
-
@JonathanPotter 谢谢你。实际上,我在发布此内容之前已经阅读了该内容。但是在 msdn 中没有记录在阻塞模式下不允许同时读写。只要有两个不同的缓冲区用于读取和写入,从技术上讲这应该不是问题。但我正在寻找有关此的更多信息。
-
@SolidMercury -
CreateNamedPipe内部调用ZwCreateNamedPipeFile和此调用内部调用IoCreateFile和CreateFileTypeNamedPipe。并且对文件的所有操作都是同步执行的——这一切都与FILE_OBJECT有关,不管你调用哪个api来创建它 -
由于读取和写入缓冲区都获得了,我认为当给定 PIPE_ACCESS_DUPLEX 时,windows 会实现某种异步机制 - 你错了。你有
FILE_OBJECT和FO_SYNCHRONOUS_IO标志。对于此类对象此类文件上的所有 I/O 使用返回的句柄跨所有线程进行序列化。
标签: windows winapi visual-c++