2013-06-27 2 views
1

표준 말한다 :표준 : weak_ptr.lock 멀티 스레드 C++

shared_ptr<T> lock() const noexcept; 

결과 :

expired() ? shared_ptr<T>() : shared_ptr<T>(*this). 

하지만 그 사이에 거짓 (개체가 여전히 존재)와 건축을 반환 만료 shared_ptr 다른 스레드가 마지막 강력한 참조를 제거 할 수 있으므로 예기치 않은 예외가 발생합니까? 이걸 어떻게 막을 수 있니?

또는 무엇인가 놓칠 수 있습니까?

답변

4

표준 라이브러리를 구현하여이를 방지 할 필요가 없습니다.

인용 된 코드는 설명의 목적으로 만 사용됩니다. lock()의 동작은이 코드와 같지만 다른 스레드와 관련하여 원자 적입니다.

어떻게 완료되었는지 알고 싶으면 소스 코드를 들여다 볼 수 있습니다. 템플릿 클래스이므로 코드가 반드시 헤더 파일에 있습니다. 그러나 조심하십시오! 표준 C++ 라이브러리 소스 코드는 희미한 마음을위한 것이 아닙니다.

+0

"lock()의 ​​동작은이 코드와 같지만 다른 스레드와 관련하여 원자 적입니다." 그렇다면 표준 텍스트는 아무 것도 말하지 않으므로 결함이 있습니다. –

+2

@ R.MartinhoFernandes : 표준은 구현을 정의하지 않고 결과의 * 값 *을 정의합니다. 그래서 표준 텍스트는 괜찮습니다. –

+0

@ R.MartinhoFernandes : 두 번째 생각에, 나는 [boost] (http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/weak_ptr.)에서'weak_ptr :: lock()'의 원 자성을 생각해 낸다. htm),하지만 지금은 libstd 구현에 적용되는지 모르겠습니다. [이] (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