2010-02-17 213 views
4

考慮:C++線程靜態構造函數

void getBlah() { 
    static Blah* blah = new Blah(); 
    return blah; 
} 

在多線程環境,是有可能,新布拉赫()被調用一次以上?

謝謝!

回答

4

C++標準不作任何的靜態線程安全保障受審初始化 - 您應該將靜態初始化視爲需要顯式同步。

的報價亞歷山大·格斯勒給出:

如果控制進入申報 同時當對象被 初始化,併發執行 應等待 初始化

是完成來自C++ 0x草案,並不反映當前的C++標準或許多C++編譯器的行爲。

在當前的C++標準,即通道讀取:

如果控制再次進入聲明(遞歸),而對象被 初始化,則該行爲未定義

+0

甚至連C++ 0x草案都有一個例子,突出了6.7節第4段末尾的這一點。 – dirkgently 2010-02-17 13:11:23

+0

感謝您的澄清。 – 2010-02-17 13:14:33

0

編輯:這屬於C++ 0x草案。

引用的標準(6.7-4):

如果控制進入聲明同時 同時對象被初始化時,並行執行必須等待初始化完成

要我的理解,像這樣的靜態初始化是線程安全的。

+0

這就是來自C++ 0x草案的引用。 – 2010-02-17 12:58:41

+0

是的,它確實來自cpp0x草案。所以我認爲目前的標準中缺少這條線? – 2010-02-17 13:01:40

+0

我已將當前標準的文本添加到我的答案中。 – 2010-02-17 13:07:36

2

不過請注意,指向Blah的指針是static

6.7聲明陳述

4 [...]。否則這樣的對象是 首次初始化控制 穿過其聲明;例如 當初始化完成 後,對象被認爲初始化爲 。如果初始化 退出拋出一個異常, 初始化是不完整的,所以它 將再次下一次 控制進入申報