2016-06-19 3 views
-2

모두 : this page에 따르면 C++ 구현은 일반적으로 스레드의 안전성을 보장하기 위해 원자 참조 수를 사용하지만 이는 일부 경우 버그가있는 것으로 보입니다. FUNC2의 복사본 건설 A1 감소의 내부 레퍼런스 카운트 후 발생하는 경우, 상기 코드 보듯C++ shared_ptr 스레드 안전을 보장하는 방법은 무엇입니까?

``

void func2(shared_ptr<int>* x) { 
    shared_ptr<int> a(*x); 
    *a += 1; 
} 

thread func1() { 
shared_ptr<int> a1(new int(10)); 
thread t (func2, &a1); 
return t; 
} 

``는 포인터는 두번 삭제 얻을 것이다 권리?

+7

버그가있는 것은 여기 * 귀하의 코드 ... 매달려있는 원시 포인터입니다. – deviantfan

답변

4

원자 참조 수는 참조 카운트 만 스레드 안전성을 보장합니다. 참조 된 클래스를 스레드 안전 클래스로 변환하지 않습니다. std::shared_ptr에 대한 포인터를 새 스레드로 전달하는 것처럼 스레드가 안전하지 않은 코드를 작성하는 것을 방지하지는 않지만 새로운 스레드가 자신의 복사본을 확보 할 수 있기 전에이를 파기하는 것은 아닙니다.

스레드 안전 논리를 작성하는 것은 여전히 ​​책임이 있습니다. 그러나 스레드에 대한 참조 카운팅에 의존 할 수 있습니다.