[問題] singleton pattern for multithread

看板C_and_CPP (C/C++)作者 (哈哈哈哈哈哈哈哈哈哈哈)時間16年前 (2009/07/03 14:00), 編輯推噓5(5016)
留言21則, 5人參與, 最新討論串1/2 (看更多)
我的問題是關於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

07/03 14:24, , 1F
他的意思是 pInstance 被設值後其它 thread 不會進 lock
07/03 14:24, 1F

07/03 14:25, , 2F
但可能 pInstance 還未被初始完全, 只是先被設值
07/03 14:25, 2F

07/03 14:26, , 3F
但實際上 multi-threaded project 有可能被這樣最佳化嗎?
07/03 14:26, 3F

07/03 17:17, , 4F
E大, 謝謝你的回覆, 我不太確定我有沒有誤解你的意思
07/03 17:17, 4F

07/03 17:21, , 5F
但如果 new 執行之後無法讓 pInstance 初始完成
07/03 17:21, 5F

07/03 17:21, , 6F
感覺應該要責怪 WindowManager的建構式
07/03 17:21, 6F

07/03 17:22, , 7F
而不是雙重檢查法的架構, 所以我不懂網頁想表達什麼
07/03 17:22, 7F

07/03 17:26, , 8F
另外. 這裡的最佳化我想其實只是第三段程式比第二段好
07/03 17:26, 8F

07/03 17:26, , 9F
應該還沒有談到利用multithread做最佳化
07/03 17:26, 9F

07/03 17:31, , 10F
有啊,內文不就說最佳化後有可能讓pI在WM前初始化完成
07/03 17:31, 10F

07/03 17:42, , 11F
l大, 我不太了解multithread, 為什麼多執行緒會讓
07/03 17:42, 11F

07/03 17:48, , 12F
pI在WM前初始化完成??一般的編程一定是singlethread嗎
07/03 17:48, 12F

07/03 17:52, , 13F
new某個物件new到一半就不做了, 讓我有點難以接受阿XD
07/03 17:52, 13F

07/03 18:20, , 14F
我的意思是, compiler 將 Constructor 展開而先 assign
07/03 18:20, 14F

07/03 18:20, , 15F
pInstance ... 但這樣我其實不太能接受, 可以實測看看
07/03 18:20, 15F

07/03 19:57, , 16F
看這個 http://tinyurl.com/krr2wz 講的很清楚
07/03 19:57, 16F

07/03 19:57, , 17F
C++0x 也為了這個問題大修 memory model
07/03 19:57, 17F

07/04 00:20, , 18F
推樓上的資料,這樣說來多線程真的可以很可怕 orz
07/04 00:20, 18F

07/04 00:21, , 19F
本來正常的flow 要想得對已經不容易,再加上這類問題
07/04 00:21, 19F

07/04 00:21, , 20F
真的要兼顧的話實在不是常人能做了orz
07/04 00:21, 20F

07/04 14:32, , 21F
我有比較瞭解了, 謝謝大家熱心的回覆
07/04 14:32, 21F
文章代碼(AID): #1AJPviJe (C_and_CPP)
文章代碼(AID): #1AJPviJe (C_and_CPP)