작성
·
491
0
매개변수로 TSharedPtr<Wraight> 형을 받았을 때 멀티쓰레드 환경으로부터 안전하다는 부분이 이해가 잘 안됩니다.
함수내의 로직 안에서 최소 레프카운트 1은 보장되기에 지워질 가능성은 0%라는 부분, 개체의 생명주기를 보장받을 수 있다는 부분은 이해가 됩니다. 그렇지만 매개변수 TSharedPtr<Wraight> 형으로 받을 때, 복사생성자가 호출되어 Set(rhs._ptr); 이 실행될 때, 다른 쓰레드에서 해당 TSharedPtr<Wraight>이 Release() 된다면 마찬가지로 매개변수로 전달받다가 문제되는 상황 아닌가요? 궁금합니다
답변 3
0
0
위의 "여전히 ptr2 또한 TSharedPtr 타입으로 참조하고 있으니 그럴 수 없습니다." 라는 구문이 이해가 되질 않습니다. 여러개의 쓰레드에서 release를 하는경우가 생기면 삭제가 될 것 같은데... ptr2가 TSharedPtr로 참조하고 있는것과 무슨 상관이 있는지 모르겠습니다ㅠㅠ
0
전제조건은 생포인터를 막 꺼내쓰지 않고,
항상 일관적으로 TSharedPtr로 관리할 경우 <<< 입니다.
이 경우
복사생성자가 호출되어 Set(rhs._ptr); 이 실행될 때
~라는게 실행중이라면 최소한 1개의 쓰레드는 걔를 참조하고 있을테니
메모리가 절대 삭제되지 않음이 보장되는 것이죠.
복사생성자가 호출되고 바로는 아직 참조카운트를 올리기 전이라 삭제되지 않음을 보장 받을 수 없지 않나요?
아래와 같은 구문에서 다른 쓰레드에 의해 해당 TSharePtr<Wraight>의 Release()가 호출되어 지워질 수 있는 가능성도 있지 않나요?
복사가 실행되고 있다는 것은 어딘가에서
TSharedPtr ptr1 = ptr2; 와 같은 복사 코드를 넣었다는 것인데,
여전히 ptr2 또한 TSharedPtr 타입으로 참조하고 있으니 그럴 수 없습니다.
이게 아리달송하다면 실제로 문제가 될법한 상황을 직접 구현해보시기 바랍니다.
엇 한가지만 더 여쭤볼 수 있을까요?
그렇다면 test(WraightRef& target){ /* */ }
해당 함수도 멀티쓰레드에 관점에서 안전할 수 있는거죠? 매개변수로 참조카운트를 증가시키지는 않지만 호출하는 부분에서 TSharedPtr 로써 넘겨주고 있으니 참조 카운트 1은 최소 보장 받을 수 있으니까요 제가 이해한 부분이 맞을까요?
여러 쓰레드에서 Release를 하더라도
당장 실제로 객체가 메모리에서 삭제되진 않고요.
다만 RefCount를 줄일 수는 있습니다.
마지막으로 RefCount가 0이 되면 실제 메모리에서도 날리는 개념입니다.
근데 누군가가 TSharedPtr로 기억하고 있으면, RefCount가 최소 1이라는 얘기가 되겠죠.