使用CloseHandle"双关闭"句柄是否安全?

Joh*_*ohn 6 winapi handles

不止一次调用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或其任何组合重复此实验.