문제

질문이 있습니다 boost::shared_ptr<T>.

스레드가 많이 있습니다.

using namespace boost;

class CResource
{
  // xxxxxx
}

class CResourceBase
{
public:
   void SetResource(shared_ptr<CResource> res)
   {
     m_Res = res;
   }

   shared_ptr<CResource> GetResource()
   {
      return m_Res;
   }
private:
   shared_ptr<CResource> m_Res;
}

CResourceBase base;

//----------------------------------------------
// Thread_A:
    while (true)
    {
       //...
       shared_ptr<CResource> nowResource = base.GetResource();
       nowResource.doSomeThing();
       //...
    }

// Thread_B:
    shared_ptr<CResource> nowResource;
    base.SetResource(nowResource);
    //...

Q1

만약에 스레드 _A 신경 쓰지 마세요 nowResource 이 코드 의이 부분에 문제가 있습니까?

내 말은 언제 스레드 _b 하지 마라 SetResource() 완전히, 스레드 _A 잘못된 스마트 포인트를 얻으십시오 GetResource()?

Q2

스레드 안전은 무엇을 의미합니까?

자원이 최신인지 신경 쓰지 않으면 shared_ptr<CResource> nowResource 할 때 프로그램을 충돌시킵니다 nowResource 릴리스되거나 문제가 파괴 될 것입니다 shared_ptr<CResource>?

도움이 되었습니까?

해결책

부스트에서 선적 서류 비치:

shared_ptr 객체는 내장 유형과 동일한 수준의 스레드 안전성을 제공합니다. ㅏ shared_ptr 인스턴스는 여러 스레드에 의해 동시에 "읽기"(const 조작 만 사용하여 액세스) 될 수 있습니다. 다른 shared_ptr 인스턴스는 "작성"(예 : 변한 작업을 사용하여 액세스 할 수 있습니다. operator= 또는 재설정) 여러 스레드에 의해 동시에 (이 인스턴스가 사본이라도, 아래에 동일한 참조 수를 공유합니다.)

다른 동시에 접근하면 정의되지 않은 동작이 발생합니다.

따라서 사용량은 안전하지 않습니다. 동시 읽기 및 쓰기를 사용하므로 m_res. 예 3 부스트 문서에서도이를 보여줍니다.

별도를 사용해야합니다 뮤텍스 그것은 접근을 지키고 있습니다 m_res 안에 SetResource/GetResource.

다른 팁

boost::shared_ptr<> 특정 수준의 스레드 안전성을 제공합니다. 참조 수는 스레드 안전 방식으로 스레드 안전 방식으로 조작됩니다 (스레드 지원 비활성화를 부스트하지 않는 한).

따라서 복사 할 수 있습니다 shared_ptr 주변과 ref_count는 올바르게 유지됩니다. 여러 스레드에서 안전하게 할 수없는 것은 실제를 수정하는 것입니다. shared_ptr 여러 스레드에서 객체 인스턴스 자체 (예 : reset() 여러 스레드에서). 따라서 사용량은 안전하지 않습니다. 실제를 수정하고 있습니다. shared_ptr 여러 스레드의 인스턴스 - 자신의 보호가 필요합니다.

내 코드에서 shared_ptr일반적으로 가치별로 통과되는 지역 주민 또는 매개 변수이므로 문제가 없습니다. 한 스레드에서 다른 스레드로 가져 가면 일반적으로 스레드 안전 큐를 사용합니다.

물론이 중 어느 것도 shared_ptr - 그것은 또한 당신에게 달려 있습니다.

TR1 :: SHARED_PTR (부스트를 기반으로하는) 문서는 다른 스토리를 알려줍니다. 즉, 리소스 관리는 스레드 안전이지만 리소스에 대한 액세스는 그렇지 않다는 것을 의미합니다.

"...

실 안전

C ++ 0x 전용 기능은 다음과 같습니다. rvalue-Ref/Move Support, Allocator 지원, 별명 생성자, Make_shared & Allocate_shared. 또한 AUTO_PTR 매개 변수를 취하는 생성자는 C ++ 0X 모드에서 더 이상 사용되지 않습니다.

Boost Shared_PTR 문서의 스레드 안전 섹션에 따르면 "shared_ptr 객체는 내장 유형과 동일한 수준의 스레드 안전성을 제공합니다."라고 말합니다. 구현은 해당 인스턴스가 참조 수를 공유하는 경우에도 별도의 Shared_PTR 인스턴스에 대한 동시 업데이트가 올바른지 확인해야합니다.

shared_ptr a (새로운 a); shared_ptr b (a);

// 스레드 1 // 스레드 2

a.reset (); B.Reset ();

동적으로 할당 된 물체는 나사산 중 하나에 의해 파괴되어야합니다. 약한 참고 자료는 사물을 더욱 흥미롭게 만듭니다. shared_ptr을 구현하는 데 사용되는 공유 상태는 사용자에게 투명해야하며 불변은 항상 보존되어야합니다. 공유 상태의 주요 부분은 강력하고 약한 기준 수입니다. 이들에 대한 업데이트는 관리 자원 (결국 Shared_PTR의 작업에 대한 정리를 보장하기 위해 모든 스레드에 원자력적이고 가시적이어야합니다. Multi-Processor Systems Memory Synchronization이 필요할 수 있으므로 참조 수량 업데이트 및 파괴가 필요할 수 있습니다. 관리되는 자원의는 레이스가 없습니다.

..."

보다http://gcc.gnu.org/onlinedocs/libstdc+/manual/memory.html#std.util.memory.shared_ptr

m_res threadSafe가 아닙니다. 동시 읽기/쓰기이기 때문에 BOST :: ATOMIC_STORE/LOAD 기능을 보호하려면 필요합니다.

//--- Example 3 ---
// thread A
p = p3; // reads p3, writes p
// thread B
p3.reset(); // writes p3; undefined, simultaneous read/write

또한 클래스에는 주기적 참조 조건이 있습니다. 그만큼 shared_ptr<CResource> m_Res 회원이 될 수 없습니다 CResourceBase. 당신이 사용할 수있는 weak_ptr 대신에.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top