不止一次调用CloseHandle会有什么影响?
文档说"你不应该",但我认为我有一个现实的案例,其中一个句柄可能是外部关闭的命名管道(见帖子的结尾).
在这种情况下,CloseHandle在调试模式下抛出异常,这表明开发人员认为这很严重,但文档并不完全清楚.
(礼貌请求:请避免回答"只是不要!":-).当然,应该避免不止一次关闭手牌,当然还有很好的技巧来帮助解决这个问题:如果你不这样做,我只会感兴趣.
我听说有些人建议,如果操作系统很快重复使用句柄,你最终可能会关闭另一个不同的句柄.
这可能吗?
Windows如何选择句柄ID?
是否可以保证手柄值的重复使用频率如何?
(例如,TCP确保端口号不能在特定时间范围内重用).
你可以关闭句柄类型的句柄吗?例如,我是否可以认为我正在关闭管道但最终关闭一个事件?
谢谢!
约翰
(上下文:我在客户端/服务器模型中使用命名管道.在我看来很难确保确保一方确保关闭句柄,例如在进程崩溃/被杀案件中.也许我错了,但肯定MSDN示例代码在我看来似乎允许客户端关闭共享句柄,然后当服务器试图关闭它时,它已经关闭).
sho*_*osh 12
很简单,可以检查:
HANDLE h = 0;
h = CreateMutex(NULL, TRUE, NULL);
printf("%X\n", h);
CloseHandle(h);
h = 0;
h = CreateMutex(NULL, TRUE, NULL);
printf("%X\n", h);
Run Code Online (Sandbox Code Playgroud)
在我的WinXP x64中,这产生了:
2E8
2E8
Run Code Online (Sandbox Code Playgroud)
所以你有它.
与TCP端口不同,句柄立即回收.
使用您喜欢的API或其任何组合重复此实验.