【发布时间】:2012-03-26 12:02:12
【问题描述】:
这里有一个关于boost::shared_ptr的问题:
我有 3 个课程。
A 是某种 Main 类,负责管理所有内容。
B 是一个类,它只具有执行某些工作的功能。
Dispatcher 只是一个封装了一个单独线程的类,它从该线程中Bdone 的 Instaces 获取工作。
所以它有点像这样工作:A 有一个Dispatcher 的实例。现在偶尔A 会生成B 的实例并将其传递给调度程序。
重要的是,B 完成后需要调用A::callback()。这就是为什么B 在其构造函数中获得对 A 的引用(参见下面的代码)
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;
}
所以我的问题是:
为此目的使用 boost::shared_ptr 是否合理?
我不确定shared_ptr 是否适合去这里。我的问题是,当我从B 调用构造函数并将this 指针传递给它时,我不知道究竟会发生什么。现在根据shared_ptr,我假设m_PointerToA 拥有A 的所有权。但这意味着当Dispatcher 中的工作完成并且我的B 实例被删除时,它也会删除对m_PointerToA 的引用,这实际上意味着它会杀死对象本身,尽管事实上存在一个实际的主循环中A 的实例。
更新:
添加了一些代码并更新了问题本身以使其更加清晰。
【问题讨论】:
-
您不想跨线程边界使用
shared_ptr。这是std::auto_ptr的语义真正闪耀的地方;一旦将指针传递给另一个线程,就无法在原始线程中访问它。 -
boost::shared_ptr实际上是线程安全的,因为您可以依赖引用计数处于安全状态。 -
@JamesKanze 但我传递的指针实际上是一个
this指针。所以实际上我并没有特别对“指针”做任何事情。但当然,this的实例中的一些代码仍在主线程中运行。我实际上只是想使用shared_ptr,所以我不会因为丢失引用而遇到任何麻烦。使用原始指针我也没有问题... -
我有几个问题。您正在
initClassB中更新您的 B 实例,但它是如何引用的?如果你将它存储在 A 中,你是怎么做到的?您将它传递给您所说的线程,那么仅从该线程引用吗?问题实际上是关于你希望 A 怎么死。你想让它和另一个线程一起下降吗?就目前而言,B 是 A 的唯一所有者,它将与 B 一起死亡。在这种情况下,我还建议使用 auto_ptr,它可以清楚地说明谁拥有 A 实例。 -
@Dennis Gonna 更新问题,以便更清楚(我第一次写它时省略了一些代码=
标签: c++ pointers boost shared-ptr