【发布时间】:2012-02-17 16:43:17
【问题描述】:
我在一个高度多线程的应用程序上面临许多崩溃。
看了这些MSDNpage、technical note和this article on TLS,我了解到CWnd对象映射到Thread Local Storgae中的HWND(TLS,这是一个线程依赖的内存访问)。
我打算解耦所有看起来像 CWnd 线程远程访问的东西,并将其转换为 HWND 引用,然后使用 ::PostMessage 作为通信端口。
但是我的一位同事真的坚持我只保留外线程中的CWnd*,采用::PostMessage策略ok,但是在外线程中使用CWnd::GetSafeHwnd()或pMyCWnd->m_hWnd以便恢复原生HWND。
我一直在争论 nowhere 我已经看到 GetSafeHwnd() 是线程安全的,并且 CWnd 对象在 TLS 中,它在另一个线程中的值是不同的。
我错了? MSDN 显然使用了Unexpected results这个术语。
对于从创建者线程在外线程中调用CWnd::GetSafehwnd() 或pMyCWnd->m_hWnd,您的观点是什么?
您是否有任何 MSDN 文档说明这是否安全。
【问题讨论】:
标签: c++ multithreading winapi thread-safety thread-local-storage