gpt4 book ai didi

c++ - 适当使用 boost::shared_ptr?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:42 27 4
gpt4 key购买 nike

关于 boost::shared_ptr 的问题:

我有 3 个类(class)。

A 是某种负责管理一切的主类。

B 是一个类,它只具有完成某些工作的功能。

Dispatcher 只是一个围绕单独线程的类,它从 B 的 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 */
};

调度程序.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 的实际实例。

更新:

添加了一些代码并更新了问题本身以使其更加清晰。

最佳答案

这种设计没有什么特别的问题。但是我更愿意使用 boost::function<> & boost::bind .它为回调提供了更好的灵 active ,并且不会将 B 与 A 紧密联系在一起。当然,您仍然需要注意通常的线程警告。

关于c++ - 适当使用 boost::shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9871710/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com