2013-06-27 15 views
1

STD表示:的std :: weak_ptr.lock語義多線程C++

shared_ptr<T> lock() const noexcept; 

返回:

​​

但在之間過期返回false(對象仍然存在)和結構的shared_ptr另一個線程可以刪除最後一個強引用,從而拋出一個意外的異常?如何防止這種情況?

還是我錯過了什麼?

回答

4

您不必阻止它,它是由標準庫的實現的照顧。

所引用的代碼只是爲了說明用途:lock()行爲是因爲這個代碼,但原子相對於其他線程。

如果你想知道它是怎麼做的,你可以窺視的源代碼。它是一個模板類,所以代碼肯定會在頭文件中。但要小心!標準的C++庫源代碼不適合心臟病發作。 「

+0

」lock()的行爲與此代碼相同,但與其他線程原子級相同。「如果是這樣,標準文本什麼都不說,因此是有缺陷的。 –

+2

@ R.MartinhoFernandes:該標準沒有定義實現,而是結果的*值*。所以標準文本很好。 –

+0

@ R.MartinhoFernandes:關於第二個想法,我記得'的weak_ptr ::鎖()'從[助推]原子性(http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/weak_ptr。 htm),但現在我不確定這是否適用於libstd實現。 [This](http://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.html),也許[this](http://msdn.microsoft.com/en-us/library/c9ceah3b%28v= vs.100%29.aspx)似乎表明他們這樣做,但我現在無法在標準中找到確認... – rodrigo