2012-09-03 6 views
0

다른 클래스의 서로 다른 인스턴스간에 하나의 클래스에서 뮤텍스를 공유하는 방법을 궁금합니다.클래스의 다른 인스턴스간에 mutex를 어떻게 공유합니까?

지금은 개인 멤버 변수로 부스트 뮤텍스와 condition_variable을 가진 클래스 인 Indexer가 있습니다. 내 메인에 Indexer 클래스의 auto_ptr을 만들고 다른 클래스 인 Robot의 인스턴스에 Indexer의 포인터를 전달합니다.

나는 다음과 같이 그렇게 :

std::auto_ptr<Indexer> index_service(new Indexer()); 
Robot a(*index_service.get()); 
Robot b(*index_service.get()); 
Robot c(*index_service.get()); 

로봇의 생성자는 다음과 같습니다 뮤텍스가 noncopyable 때문에, 내가 얻을

class Robot 
{ 
    public: 
    Robot(Indexer &index_service); 
    private: 
    Indexer index_service; 
}; 

그러나 :

Robot(Indexer &index_service) 
{ 
    this->index_service = index_service; 
} 

로봇의 헤더처럼 보인다 오류.

mutex 및 condition_variable shared_ptrs를 만들려고했지만 예상치 못한 동작이 발생할 수 있음을 읽었습니다.

누군가가 나에게이/올바른 올바른 방법을 보여줄 수 있습니까?

감사합니다.

+1

Robot 클래스에서 인덱서 유형의 변수를 갖고 있다고 생각하십니까? –

답변

2

은 내가 C++ 전문가 아니에요,하지만 참조 패스의 신성 혼합처럼 보인다 포인터가 여기에 문제가 있습니다.

는 특히이 수행 this->index_service = index_service;
을하지만 값은 Indexer &index_service
로 전달되고 로컬 index_service이기 때문에 내가 할당이 사본을 의미 있다고 생각 Indexer index_service;
을 입력합니다.

나는 하나의 인스턴스가 Indexer 인 것으로 가정하므로 실제로는 Robot 클래스에 참조를 저장하는 것이 좋습니다. 그렇게하려면 생성자가 포인터를 가져 오도록하는 것이 좋습니다 (이는 *index_service.get() 호출이 당신을 어쨌든 얻는 것입니다). 더 나아가 클래스 변수가 포인터 유형이되도록하십시오.

+0

감사합니다. 감사합니다! 일부 코드를 다시 살펴보고 로컬 복사본을 만들지 않았는지 확인해야합니다 ...이 작업을 수행 한 후이를 index_service.get()으로 변경해야했습니다. – noko

+0

아, 그럴 것입니다. 내 statement "index_service.get() 호출이 어쨌든 당신을 얻고있는 것"이 ​​잘못되었습니다 ... 왜냐하면 생성자가 참조로 전달되면 괜찮은 get (객체를 제공)의 반환을 취소합니다. C++이 당신을 위해 마술을합니다 ... –

0

클래스에 정적 boost :: mutex를 선언하십시오. .cpp 파일에이 파일을 정의해야합니다. 여기

확인 : Using static mutex in a class

0

그냥 다른 옵션으로는 std::auto_ptr 대신하고 Robot 수준의 변화 Indexer to 표준 : shared_ptr`에 std::shared_ptr를 사용할 수 있습니다.

class Robot 
{ 
public: 
    Robot(std::shared_ptr<Indexer> const &index_service) 
    { 
     this->index_service = index_service; 
} 
private: 
    std::shared_ptr<Indexer> index_service; 
}; 

std::shared_ptr<Indexer> index_service(new Indexer()); 
Robot a(*index_service.get()); 
Robot b(*index_service.get()); 
Robot c(*index_service.get()); 
관련 문제