我正在尝试为 CRITICAL_SECTION 解锁代码添加一些调试检查,并尝试了以下操作:
...
if (m_pCritSect) {
ASSERT(m_pCritSect->OwningThread == GetCurrentThreadId());
LeaveCriticalSection(m_pCritSect);
}
}
通过调试 CRITICAL_SECTIONS(使用 VS 2005,主要在 WindowsXP 上),我“知道” (中定义的结构的OwningThread
成员)的值是持有锁的线程的ID的值。RTL_CRITICAL_SECTION
winnt.h
但是,线程 ID 由DWORD
(typedef for unsigned long
) 值表示,而此变量的类型HANDLE
(typedef for void*
) 需要a使用reinterpret_cast
才能HandleToULong
宏 frombasetsd.h
以使上述代码正常工作。
甚至MSDN 文档状态:
当第一个线程调用 EnterCriticalSection 例程时,(...) OwningThread 成为调用者的线程 ID。
那么到底为什么这被定义为一个HANDLE
?
编辑注意:我发现了一个声明,其中海报表明 HANDLE / DWORD-Id 不匹配是某些 Windows 内部的一些已知错误功能。所以也许这也是这里的情况:
GetCurrentThreadId 返回一个 DWORD,我在消息中将其发送给内核。PsLookupThreadByThreadId 采用 HANDLE 中的线程 ID,......
这是一个已知的 Windows API 错误(“已知”是因为我与相关的过滤器管理器 DEV 讨论了这个问题,因为它也出现在过滤器管理器中,因为 I/O 管理器 API 问题。)只要你不这样做t 有超过 5 亿左右的线程和进程(它们使用单个共享句柄表)你会没事的。也许到那是一个真正的问题时,我们会运行一些不同的东西。[ RE: ThreadId 处理 64 位?, 08 年 8 月 8 日 14:21,托尼·梅森]