Windows读取命名管道时阻塞,直接关闭管道句柄ReadFile能否安全返回?

mamutu02 2017-10-30 08:42:38
一个线程在读取CreateNamedPipe创建的命名管道,没有数据的情况下ReadFile会阻塞。
现在我想让该线程返回,直接关闭管道句柄是安全的做法吗?是否有人尝试过?

注:

我知道可以用Pending I/O或者PeekNamedPipe模型解决,但现在有一个程序用的是我上面提到的方法。该程序在多线程压力测试中卡死,发现个别线程卡在ReadFile没有返回,怀疑关闭句柄并不能安全解除ReadFile阻塞。

请问是否有人遇到过相同的问题,或者是用关闭句柄实现过但并没有遇到问题?

感谢解答。
...全文
1371 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mamutu02 2017-11-06
  • 打赏
  • 举报
回复 1
1楼,回答无具体内容。 2楼,提供的CancelSynchronousIo不知为啥没效果,但受该启发用了CancelIoEx,问题解决。 3楼,鉴于改用CancelIoEx方案后我提到的问题已解决,且未再发现其他问题,故基本可以判明问题是直接CloseHandle引起的。另外,原程序在Server版系统上测试,数据传输线程有偶发崩溃现象,在更换方案后解决,基本也可判明是CloseHandle引起。故得出结论,CloseHandle关闭正在读写操作中的句柄是不规范的调用方法,可能引发严重问题。如果你程序中存在这种使用方法,建议更改。 综上,分给2楼。
Saleayas 2017-10-31
  • 打赏
  • 举报
回复
CancelSynchronousIo
赵4老师 2017-10-31
  • 打赏
  • 举报
回复
《Windows核心编程》?
大尾巴猫 2017-10-31
  • 打赏
  • 举报
回复
直接关闭管道句柄,阻塞的ReadFile会返回吧,出错返回。具体没试过。

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧