Вопрос о boost::shared_ptr
здесь:Соответствующее использование для boost :: shared_ptr?
У меня 3 класса.
A
- это некий Основной класс, который несет ответственность за все.
B
- это класс, который имеет функции для выполнения определенной работы.
Dispatcher
- это класс, который обтекает отдельную нить, которая получает работу от Instaces 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
, я бы предположил, что m_PointerToA
занимает вид владения A
. Но это будет означать, что когда работа в Dispatcher
будет выполнена, и мой экземпляр B
будет удален, он также удалит ссылку на m_PointerToA
, которая на самом деле означает, что она убивает сам объект, несмотря на то, что в главном случае есть фактический экземпляр A
петля.
Update:
Добавлен некоторый код и обновляется сам вопрос, чтобы сделать его более ясным.
Вы не хотите использовать 'shared_ptr' через границы потоков. Это одно место, где действительно синтаксическая семантика 'std :: auto_ptr'; как только вы передадите указатель на другой поток, вы не сможете получить к нему доступ в исходном потоке. –
'boost :: shared_ptr' фактически потокобезопасен, в том смысле, что вы можете полагаться на подсчет ссылок, чтобы быть в безопасном состоянии. – Ylisar
@JamesKanze Но указатель, который я передаю, на самом деле является указателем 'this'. Так что фактически я ничего не делаю с «указателем» в частности. Но, конечно, некоторый код в экземпляре из 'this' по-прежнему работает в основном потоке. На самом деле я просто хотел использовать 'shared_ptr', поэтому у меня не возникало никаких проблем, теряя ссылки. У меня также не было бы проблем с использованием необработанного указателя ... – Toby