我在一个高度多线程的应用程序上面临许多崩溃。
阅读这些 MSDN页面、技术说明和这篇关于 TLS的文章,我了解到CWnd
对象在 Thread Local Storgae(TLS,这是一个线程相关的内存访问)中映射到 HWND。
我打算解耦所有看起来像 CWnd 线程远程访问的东西,并将其转换为HWND
引用,然后::PostMessage
用作通信端口。
但是我的一位同事确实坚持我只是保留CWnd*
在外国线程中,采用::PostMessage
策略可以,但是在外国线程中使用CWnd::GetSafeHwnd()
orpMyCWnd->m_hWnd
以便恢复本地HWND
。
我一直在争辩说,我在任何地方都没有看到它GetSafeHwnd()
是线程安全的,并且CWnd
对象在 TLS 中,它在另一个线程中的值是不同的。
我错了 ?MSDN 显然使用了Unexpected results一词。
CWnd::GetSafehwnd()
关于从创建者线程调用或pMyCWnd->m_hWnd
在外部线程中,您的观点是什么?
您是否有任何 MSDN 文档说明这是否安全。