我在一个非常多线程的应用程序中面临着大量的崩溃。是CWnd :: GetSafeHwnd()和CWnd :: m_hWnd ThreadSafe?
读取这些MSDN page,technical note和this article on TLS,我已经理解CWnd对象映射到TLS中的HWND,这是一个线程相关的内存访问。
我打算解开看起来像CWnd线程远程访问的所有东西,并将其转换为HWND引用,然后使用:: PostMessage作为通信端口。 (就我目前看到的当前代码而言,它代表了大量的工作,事实上我精心制定了一个解决方案,这需要很多时间,所以我们不得不讨论它)。
但是我的一个同事真的坚持深,我只是保持的CWnd *在外国人线程,采用:: PostMessage的政策好,但使用的CWnd :: GetSafeHwnd()或pMyCWnd-> m_hWnd在国外螺纹以恢复本地HWND。
我一直认为,无处我已经看到GetSafeHwnd()是线程安全的, 和CWnd的Objet公司在TLS是,它在另一个线程值是不同的。 我错了? MSDN明确使用术语“意外结果”。
你有什么看法,从创建者线程的外线程中调用CWnd :: GetSafehwnd()或pMyCWnd-> m_hWnd?
是否有任何MSDN文档声明这是安全或不安全的。
不错的建议,但我不能重新编码整个事情,很多LOC,它已经超过10年了,有很大的历史我不能把它抹去:-) – 2012-02-17 16:52:07
那么,你的问题基本上是“我必须做这件极不安全的事情,安全吗?“答案可能是“没有东西会使它安全”。您可以在某种程度上使其更安全*,但我怀疑它可以在当前的设计中无碰撞。 – StilesCrisis 2012-02-17 16:56:49
(顺便说一下,我可以联系,我也在一个10岁的MFC代码库上工作,感谢上帝,我们没有线程,原来的编程人员几乎没有足够的智能来获得这个权利) – StilesCrisis 2012-02-17 16:57:39