→ loveme00835: 你有 foo 不用還去創新的幹嘛? 04/06 13:58
→ kingofsdtw: 他是強調同一時間,去get還未初始化的SingleInstance 04/06 15:12
推 lovejomi: magic static 04/06 15:15
→ loveme00835: 看來你還是沒懂 foo->getInstance() 這個呼叫奇怪的 04/06 15:51
→ loveme00835: 地方 04/06 15:51
不懂...
→ aiwhat: :: 04/06 16:51
Orz 感謝 的確是應該 foo::getInstance()
但是如何避免同時兩個thread foo::getInstance() 呢?
推 idiont: mutex 04/06 17:04
7→ sarafciel: 起thread前先叫一次就好啦XD 04/06 17:14
這點我有提過,但面試RD說堅持要一起呼叫XD
剛剛看了一下
https://stackoverflow.com/questions/12248747/singleton-with-multithreads
C++11中
直接宣告即可保證唯一
static Singleton* getSingletonInstance()
{
static Singleton instance;
return &instance;
}
static Singleton& get() {
static Singleton instance;
return instance;
}
http://tinyurl.com/yxhagcvr
in C++11 instance() does not need mutex
in C++98 it does as two threads might enter it at once an start constructing
object.
C++11 ensures single initialization of static 'local' variables.
C++98需要用mutex
而且此時mutex有被正確init嗎? 真的可以直接用?
static foo *getInstance(){
if( instance == null ){
boost::lock_guard lock(m_mutex);
if( instance == null )
instance = new foo();
}
return instance;
}
→ loveme00835: 這只是把初始化的時機拉到跑執行緒以前而已,這跟你 04/06 18:18
→ loveme00835: 另外呼叫一個函式初始化意義差不多 04/06 18:18
※ 編輯: kingofsdtw (1.169.137.208), 04/06/2019 20:09:28
→ sarafciel: mutex那個應該就是面試官想看的答案了 04/06 22:51
→ sarafciel: 至於mutex 你能在static memeber function call到就代 04/06 22:53
→ sarafciel: 表他也是static的 所以進entry point前就會建好了 04/06 22:54
謝謝大大回覆,等等我再多試幾次確認
另外...
當時我很直覺的用我的經驗回他
"雖然我知道mutex,但依照我的經驗getInstance沒人在用mutex的...."
然後他就變臉請我走了
※ 編輯: kingofsdtw (1.169.137.208), 04/07/2019 15:00:24
幫縮
C++11
Meyers Singleton Linux 只要0.04s ...
--
2019/04/07 21:04
總結一下
http://tinyurl.com/yxbrqxju
http://tinyurl.com/y2z2wvo4
Before C++11 :
Double-Checked Locking Pattern (DCLP)
After C++11 :
-Meyers Singleton
-或手動關閉-fno-threadsafe-statics
※ 編輯: kingofsdtw (1.169.137.208), 04/07/2019 21:04:57
→ Killercat: 為了一個可以迂迴解決的問題 讓每次getInstance都要額 04/10 20:24
→ Killercat: 外開個鎖 老實講這種理論狂戰士要是跟他共事你要小心 04/10 20:24
→ Killercat: 不過Meyers Singleton的確很讚 04/10 20:25
→ tinlans: 為什麼有 std::call_once() 可以用卻把它晾在一邊? 04/12 19:14
→ uranusjr: 其實你說一般 singleton 沒人在用 mutex 也是沒錯, 就當 05/01 00:58
→ uranusjr: 躲過一個難共識的同事, 其實也是不虧 05/01 00:58