我在一個非常多線程的應用程序中面臨着大量的崩潰。是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