질문에 대한 답변 : boost::shared_ptr
여기에부스트 :: shared_ptr의 적절한 사용?
나는 3 개의 클래스가 있습니다.
A
은 모든 것을 관리하는 일종의 메인 클래스입니다.
B
은 약간의 작업을 수행하는 기능을 가진 클래스입니다.
Dispatcher
은이 스레드에서 수행 된 Instites of B
에서 작업을 가져 오는 별도의 스레드를 감싸는 클래스입니다.
따라서 다음과 같이 작동합니다. A
의 인스턴스는 Dispatcher
입니다. 이제는 A
인스턴스가 B
의 인스턴스를 생성하고 디스패처로 전달합니다.
중요한 부분은 B
이 완료되면 A::callback()
으로 전화해야한다는 것입니다. B
그것의 생성자에 대한 참조를 가져옵니다 이유는
A.hpp
class A : public boost::enable_shared_from_this<A>
{
public:
A();
void sendB();
void callback();
private:
Dispatcher m_Dispatcher;
};
B.hpp
class B
{
public:
B(boost::shared_ptr<A> ptr);
boost::shared_ptr<A> m_PointerToA;
/* Some other functions */
};
Dispatcher.hpp
class Dispatcher
{
public:
void run();
void dispatch(boost::shared_ptr<B> b);
private:
void doWork();
boost::thread m_Thread;
};
(아래 코드 참조)
A.cpp
A::A()
{
m_Dispatcher.run();
}
void A::sendB()
{
boost::shared_ptr ptr_B;
ptr_B.reset(new B(this->shared_from_this);
m_Dispatcher.dispatch(ptr_B);
}
B.cpp
B::B(boost::shared_ptr<A> ptr) :
: m_PointerToA(ptr)
{
}
main_example.cpp
int main()
{
A instanceA;
while(true)
{
instanceA.sendB();
/* Do some other stuff */
}
return 0;
}
그래서 내 질문은 :
는이 목적을 위해 부스트 :: shared_ptr을 사용하기 적당한가요?
shared_ptr
이 여기에 적합한 것인지 확실하지 않습니다. 내 문제는, 내가 정확히 B
에서 생성자를 호출하고 this
포인터를 전달하면 어떻게되는지 모르겠다. 이제 shared_ptr
에 따르면 은 A
의 소유권을 취한다고 가정합니다. 그러나 이것은 Dispatcher
의 작업이 완료되고 B
의 인스턴스가 삭제되면 m_PointerToA
에 대한 참조도 삭제된다는 것을 의미합니다. 실제로는 A
이라는 실제 인스턴스가 메인에도 있지만 실제로 개체 자체를 죽일 수도 있습니다. 고리.
업데이트 :
추가 된 몇 가지 코드와 업데이트 된 질문 자체가 좀 더 명확하게하기.
스레드 경계를 넘어서서 'shared_ptr'을 사용하고 싶지는 않습니다. 이것은'std :: auto_ptr'의 의미가 실제로 빛나는 곳입니다; 포인터를 다른 스레드에 전달한 후에는 원래 스레드에서 포인터에 액세스 할 수 없습니다. –
'boost :: shared_ptr'는 안전 상태에 있도록 참조 카운팅에 의존 할 수 있다는 점에서 실제로는 스레드 안전합니다. – Ylisar
@JamesKanze하지만 내가 지나가는 포인터는 실제로'this' 포인터입니다. 그래서 실제로 저는 특히 "포인터"에 대해 아무 것도하지 않습니다. 그러나 물론 'this'의 인스턴스에있는 일부 코드는 여전히 메인 스레드에서 실행 중입니다. 실제로'shared_ptr'을 사용하기를 원했기 때문에 참조를 잃어 버려서 문제가 생기지 않았습니다. 난 또한 원시 포인터를 사용하여 아무 문제가 없을 것이다 ... – Toby