为什么 WaitForSingleObject(INVALID_HANDLE_VALUE, INFINITE) 会阻塞?

发布于 2024-08-05 05:26:37 字数 267 浏览 1 评论 0原文

为什么会

HANDLE mutexHandle = INVALID_HANDLE_VALUE;
WaitForSingleObject(mutexHandle, INFINITE);

阻塞?它不会返回错误消息。检查 INVALID_HANDLE 句柄对于互斥体来说是愚蠢的,因为我需要一个互斥体来访问互斥体句柄...

顺便说一句:如果句柄是,它确实会返回 WAIT_FAILED关闭。

Why does

HANDLE mutexHandle = INVALID_HANDLE_VALUE;
WaitForSingleObject(mutexHandle, INFINITE);

block? It does not return with an error message. Checking the handle for INVALID_HANDLE would be stupid for a mutex as I would need a mutex for accessing the mutex handle...

BTW: It does return with WAIT_FAILED if the handle was closed.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一杆小烟枪 2024-08-12 05:26:37

来自 http://blogs.msdn.com/oldnewthing/archive/ 2004/03/02/82639.aspx

第四,您必须特别小心 INVALID_HANDLE_VALUE 值:巧合的是,INVALID_HANDLE_VALUE 值在数值上恰好等于 GetCurrentProcess 返回的伪句柄()。许多内核函数接受伪句柄,因此,如果您搞砸了并意外地在失败的 INVALID_HANDLE_VALUE 句柄上调用 WaitForSingleObject,您实际上最终会等待自己的进程。当然,这种等待永远不会完成,因为进程在退出时会发出信号,因此您最终会等待自己。

From http://blogs.msdn.com/oldnewthing/archive/2004/03/02/82639.aspx:

Fourth, you have to be particularly careful with the INVALID_HANDLE_VALUE value: By coincidence, the value INVALID_HANDLE_VALUE happens to be numerically equal to the pseudohandle returned by GetCurrentProcess(). Many kernel functions accept pseudohandles, so if if you mess up and accidentally call, say, WaitForSingleObject on a failed INVALID_HANDLE_VALUE handle, you will actually end up waiting on your own process. This wait will, of course, never complete, because a process is signalled when it exits, so you ended up waiting for yourself.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文