看板 C_and_CPP 關於我們 聯絡資訊
我的問題是關於singleton pattern在多執行緒下的一種解決方法 即所謂的雙重檢查法(double-checked locking) 我對於雙重檢查法並沒有覺得有什麼問題 不過有瀏覽到一個網頁, 其中提到這個方法會有問題 網頁如下: http://www.oaklib.org/docs/oak/singleton.html 其中提到 For the following case: pInstance_ = new WindowManager(); the compiler allocates space for WindowManager object, calls the constructor and initializes pInstance_. It's quite possible that the optimizer moves around instructions so that pInstance_ is initialized before the object has been completely initialized. This may cause some other thread calling getInstance() to return partially initialzed object. 就我的理解是說 pInstance_ = new WindowManager(); 這個動作執行時, 由於multithread的關係, 可能使pInstance被初始化了, 但物件卻沒有建立完全 這點我就有點不太了解, 因為我看程式碼中在執行這行時, 前後有被lock_mutex()與unlock_mutex()包起來, 這樣仍有可能在跑 new WindowManager() 的過程中, 暫時停止new的動作, 而去跑其他的thread嗎 ?? 另外, 如果網頁上所展示的雙重檢查法(第3段程式碼)是有問題的, 除了網頁上提到的solution外, 還有其他的方法嗎 ?? 因為我覺得網頁上的solution不是很"直覺" 我有看到一個網頁也談到雙重檢查法, 但並沒有談到這個問題, 網頁如下: http://www.codeproject.com/KB/architecture/singleton.aspx 段落的標題為"Resolving the multi-threading issue" 另外, Head First Design Patterns 中講到雙重檢查法時, 也沒有提到這個問題 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.209.20.225
Ebergies:他的意思是 pInstance 被設值後其它 thread 不會進 lock 07/03 14:24
Ebergies:但可能 pInstance 還未被初始完全, 只是先被設值 07/03 14:25
Ebergies:但實際上 multi-threaded project 有可能被這樣最佳化嗎? 07/03 14:26
su31o4gj83:E大, 謝謝你的回覆, 我不太確定我有沒有誤解你的意思 07/03 17:17
su31o4gj83:但如果 new 執行之後無法讓 pInstance 初始完成 07/03 17:21
su31o4gj83:感覺應該要責怪 WindowManager的建構式 07/03 17:21
su31o4gj83:而不是雙重檢查法的架構, 所以我不懂網頁想表達什麼 07/03 17:22
su31o4gj83:另外. 這裡的最佳化我想其實只是第三段程式比第二段好 07/03 17:26
su31o4gj83:應該還沒有談到利用multithread做最佳化 07/03 17:26
legnaleurc:有啊,內文不就說最佳化後有可能讓pI在WM前初始化完成 07/03 17:31
su31o4gj83:l大, 我不太了解multithread, 為什麼多執行緒會讓 07/03 17:42
su31o4gj83:pI在WM前初始化完成??一般的編程一定是singlethread嗎 07/03 17:48
su31o4gj83:new某個物件new到一半就不做了, 讓我有點難以接受阿XD 07/03 17:52
Ebergies:我的意思是, compiler 將 Constructor 展開而先 assign 07/03 18:20
Ebergies:pInstance ... 但這樣我其實不太能接受, 可以實測看看 07/03 18:20
yoco315:看這個 http://tinyurl.com/krr2wz 講的很清楚 07/03 19:57
yoco315:C++0x 也為了這個問題大修 memory model 07/03 19:57
adrianshum:推樓上的資料,這樣說來多線程真的可以很可怕 orz 07/04 00:20
adrianshum:本來正常的flow 要想得對已經不容易,再加上這類問題 07/04 00:21
adrianshum:真的要兼顧的話實在不是常人能做了orz 07/04 00:21
su31o4gj83:我有比較瞭解了, 謝謝大家熱心的回覆 07/04 14:32