2012-02-28 4 views
3

내 클래스의 데이터 구조에 대한 액세스를 보호해야합니다. 내가 뮤텍스를 가질 수 없기 때문에 (복사 할 수 없기 때문에) 나는 shared_ptr을 가지고 거기에 뮤텍스를 유지하려고합니다. 여기 내 생각의 샘플 코드 :boost :: shared_ptr boost :: mutex 및 복사 생성자

class Sample { 
    typedef boost::lock_guard<boost::mutex> AcquireLock; 
    boost::shared_ptr<boost::mutex> mutt; 

public: 
    Sample() : mutt(new boost::mutex) {} 

    void Method() 
    { 
     AcquireLock lock(*mutt); 

     //do some work here 
    } 
}; 

내가했습니다 다음과 같은 질문 있어요 :

  • 는 클래스의 구성원으로 뮤텍스 방법 (사용하는 나쁜 관행인가, shared_ptr을 통해)?
  • shared_ptr을 통해 힙에 메모리가 할당되어 있으므로이 클래스의 복사 생성자를 사용해야합니까?

EDIT : 아마도 좀 더 자세한 내용을 제공해야합니다. 이 개체를 한 번만 만들고 std :: vector로 저장합니다. 나는 복사본을 만들 필요가 없으며 벡터가 복사본을 만들어야 할 필요가있을 때 각 복사본마다 다른 뮤텍스를 갖고 싶지 않습니다. 그것이 복사 생성자가 나를 위해 효과가 있다고 생각하는 이유입니다.

답변

1

Sample 개체의 복사본을 만들면 컴파일러에서 자동으로 생성 한 복사본 생성자 또는 명시 적으로 작성한 복사본 생성자가 호출됩니다.

샘플 개체의 복사본을 허용하는 것이 좋은지 여부는 수행하려는 작업에 따라 다릅니다. 복사를 허용하지 않는 경우 개체를 복사 할 수 없도록 설정하십시오 (예 : 복사 생성자에 대한 개인 프로토 타입을 제공합니다.

복사본을 허용하려면 각 복사본에 자체 뮤텍스가 있어야하는지 결정하고 사본 구성자를 적절히 정의해야합니다. 자동 생성 된 복사본 생성자는 단순 복사본 만 수행하므로 모든 복사본은 뮤텍스를 공유합니다.

+0

개체를 std :: vector에 저장하고 거기에서 사용하기 때문에 사본을 만들 예정입니다. 그 외에 나는 어떤 사본도 만들지 않을 것이므로 나는 기본 복사 생성자가 나를 위해 일할 것이라고 생각한다. 내가 궁금해하는 것은 얕은 복사본이 참조 카운팅이나 비슷한 것을 엉망으로 만들어 미래에 문제를 일으키는 지 여부이다. –

+1

vector에 shared_ptr을 Sample 객체에 저장하지 않으려면 복사 할 Sample 객체에 대해 걱정할 필요가 없습니다. –

2

이 접근법은 매우 타당하고 합법적이지만 클래스가 발전함에 따라 더 많은 클래스 멤버에게 동일한 기술을 적용 할 수 있습니다. 그렇기 때문에 pImpl 관용구를 사용하는 것이 좋습니다.

// in hpp: 
class Sample 
{ 
    Impl(); 
private: 
    struct Impl; 
    // compiler generated copy-constructor will copy only this shared_ptr 
    shared_ptr<void> pImpl_; 
}; 

// in cpp: 
struct Sample::Impl 
{ 
    mutex mut_; 
    // put here whatever members you need, extend Impl without affecting the Sample interface 
}; 

Impl::Impl() : pImpl_(new Impl) 
{} 
관련 문제