2013-04-10 143 views
2

我有以下代碼(它的一部分是爲簡化起見,省略)延遲初始化

頭:

class DbgModuleMarker 
{ 
public: 
    DbgModuleMarker(std::string name); 

    static std::ostream createStream(const DbgModuleMarker& marker); 

    std::ostream& operator()() const; 

}; 

extern DbgModuleMarker PHYSICS; 

源:

std::ostream& DbgModuleMarker::operator()() const 
{ 
    static std::ostream os = createStream(*this); 
    return os; 
} 

此代碼的目標是允許operator()使用如下

debug_modules::PHYSICS() << "Foo" << endl; 

我真的不知道如何以這種方式調用函數時靜態行爲。

我期望的功能createStream只會被調用一次(或不會被調用,如果operator()不會被調用

我想知道如果我期待的行爲是會發生什麼,如果這是一個可能的想法或者我做得非常不對沒有注意到它。

什麼是對線程安全和異常安全的影響?

(考慮創建本身將是線程安全的,因爲流性病的線程安全:: ostream在這裏不是我關心的)

回答

1

按照標準,在函數範圍內定義的靜態成員的初始化只發生一次。

static std::ostream os = createStream(*this); // initialized only once 

此外,如果您使用C++ 11,則它是線程安全的。

請看看這些討論:

1)thread safety of local static initialization in C++11

2)Initialization of static variables

如果你不使用C++ 11則運算符()不是線程安全的

static std::ostream os = createStream(*this); // if not C++11, this is not thread-safe and must be guarded.