2010-11-17 29 views
2

我正在使用一些我從here借用的代碼,它使用boost :: call_once來創建一個singleton類,並且希望將所有東西都轉換爲使用C++ 0x的std :: call_once刪除對Boost的依賴。有誰知道BOOST_ONCE_INIT的Std等價物是什麼?std :: once_flag相當於BOOST_ONCE_INIT

+0

「借來的」代碼究竟如何?你完成這個任務後你會放棄嗎? – SingleNegationElimination 2010-11-17 01:56:34

+1

請注意本示例代碼 - 靜態使用時不安全。你最終會在引用單例的編譯單元之間產生一個靜態競爭條件。我對這段代碼的實驗導致我的單例類型被初始化,然後scoped_ptr被null覆蓋,而一次條件已經被滿足。 – 2010-11-17 02:08:30

+0

我有同樣的問題 - 如果我使用原始指針而不是範圍的指針,情況似乎會更好。 – rcv 2010-11-17 21:01:49

回答

2

std::once_flag有一個constexpr構造函數,所以靜態存儲持續時間的實例總是被靜態初始化。

順便提一句,關於scoped_ptr的觀點很重要--- scoped_ptr實例的構造函數不是靜態初始化,所以在它被初始化之前與單例的任何用途競爭,並且可能覆蓋指針。