2011-08-24 4 views
1

나는 BYTE*, 참조 카운터 및 두 개를 동시에 액세스 할 수 없도록 보호하는 CRITICAL_SECTION을 포함하는 클래스가 있습니다.std :: tr1 :: shared_ptr가 상호 배제를 수행합니까?

나는 이것을 모두 std::tr1::shared_ptr<BYTE>으로 바꾸고 싶다.

다중 스레드가 객체가 소유권을 공유 사본이 경우에도, 같은 시간을 읽고 에서 다른 shared_ptr의 오브젝트를 작성할 수 있습니다 다음 MSDN는 말한다. 나는 클래스에서 CRITICAL_SECTION이 상호 배타적 인 방식으로 내용을을 "잠금"및 변경 그것의 외부에서 사용되는 것을 찾을 때까지

모든 것이 괜찮아 소리. 좋아, 캡슐화를 깰거야. 나는 그것을 바꾸고 싶다.

나는 shared_ptr이 메모리가 해제된다는 것을 알고 있지만, 메모리에 쓸 때 상호 배제를 보장합니까?

+1

'shared_ptr'은 가리키는 객체에 대해 무엇을하는지에 대한 지식이 없습니다. 동시에 사용되는 경우에도 공유 포인터 컨테이너 자체가 올바르게 작동한다는 것이 보장됩니다. –

답변

5

std::tr1::shared_ptr이 가리키는 데이터에 올바르게 액세스해야합니다. 그 데이터는 입니다.입니다. 삭제할 때가되면 std::tr1::shared_ptr에게만 중요합니다. std::tr1::shared_ptr 개체 자체에 대해서는

, 다음과 같은 보장이 : 안전하게 여러 스레드에서 같은 인스턴스에서 읽을 수 있습니다

  • 을;
  • 안전하게 인스턴스 (동일한 참조 횟수 또는 무엇이든 공유) 사본은 다른 인스턴스 여러 스레드에서 shared_ptr을, 변이 할 수 있습니다;

동일한 동시 액세스 (예 : 동일 인스턴스)는 동시에 정의되지 않은 동작입니다.

새 C++ 11 표준의 shared_ptr에는 원자 적 액세스를위한 특수 API가 있습니다.

+0

"상호 배제 보장"이란 무엇을 의미합니까? –

+0

@Kerrek : nothing;) –

+0

'shared_ptr'의 데이터 멤버는 쓰레드에 안전하다는 것을 알았습니다. 반면에 "foreign"데이터, 즉'shared_ptr' 생성자에 전달 된 포인터가 가리키는 데이터는 . 내가 맞습니까? –

관련 문제