2016-11-13 156 views
1

這個問題已經被問在C++ 98的上下文,並在這方面回答,但什麼也沒有明確指出關於C++ 11C++ 11線程安全函數局部靜態常量的初始化對象

const some_type& create_const_thingy() 
{ 
    lock my_lock(some_mutex); 
    static const some_type the_const_thingy; 
    return the_const_thingy; 
} 

void use_const_thingy() 
{ 
    static const some_type& the_const_thingy = create_const_thingy(); 

    // use the_const_thingy 
} 

這會初始化模式確保:

  1. 沒有競爭條件發生
  2. create_const_thingy只調用一次
  3. 這是仍然有效,如果我們去掉互斥鎖?

在此先感謝!

回答

3

由於C++ 11的所有靜態局部變量,保證在一個線程安全的方式只有一次被初始化。

作爲每cppreference

如果多個線程試圖同時初始化相同的靜態本地變量 ,初始化發生一次(可以爲任意函數與std::call_once可以得到同樣的 行爲)。 注: 雙檢查鎖定模式,從而降低運行時開銷 已經初始化本地靜態到單個非原子布爾 比較該特徵使用的變體通常實現。

因此,對於您的問題:

相關問題