发布/订阅和智能指针

发布于 07-13 18:17 字数 362 浏览 11 评论 0原文

我想实现一个简单的发布/订阅模式,其中:

单个发布者向其订阅者发布令牌(指向对象的指针)。 发布者和订阅者都是独立的线程。 我计划向每个订阅者添加线程安全队列,以便发布者可以在订阅者处理令牌时继续将令牌分发给订阅者。

正如您所看到的,这意味着所有订阅者实际上共享相同的指针(注意:订阅者无论如何都不能修改指向的对象,所以没有问题)。 一旦共享指针不再被任何订阅者使用,如果最后一个订阅者线程使用完该指针后该指针能够自动删除自身,那就太好了。

这是使用智能指针的好地方吗? 如果是这样,我应该使用哪些智能指针?

我使用 MSVC2008 在 Windows 上进行开发,并使用 Intel TBB、Boost 和 Qt。

I would like to implement a simple Publish/Subscribe pattern where:

A single publisher publishes a token (a pointer to an object) to its subscribers. Publisher and subscribers are all independent threads. I plan to add thread-safe queue to each of the subscriber such that Publisher can keep distributing the tokens to the subscribers while they are processing the tokens.

As you can see, that means all of the subscribers actually share the same pointers (note: subscribers cannot modify the pointed object in anyway, so no problem there). Once the shared pointer is not used by any of the subscribers anymore, it would be really nice if the pointer could auto-delete itself once the last subscriber thread is done with it.

Is this a good place to use a smart pointer? If so, which ones of the smart pointers should I use?

I develop on Windows with MSVC2008, and am using Intel TBB, Boost and Qt.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

豆芽 2024-07-20 18:17:04

如果我假设你的设计是可行的(零上下文听起来很有趣,但很可能是正确的), boost::shared_ptr 可能是正确的选择。

http://www.boost.org/doc/libs/ 1_38_0/libs/smart_ptr/smart_ptr.htm

编辑:从::weak_ptr切换到::shared_ptr,因为我是个白痴......

If I assume your design is viable (it smells funny with zero context, but may well be correct), boost::shared_ptr might be the way to go.

http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/smart_ptr.htm

Edit: switch to ::shared_ptr from ::weak_ptr, because I am an idiot...

仙气飘飘 2024-07-20 18:17:04

您所描述的是用于对象生命周期控制的经典 COM 模式。 您需要一个智能指针来在对象上保留引用计数器 - <代码>boost::shared_ptrboost::intrusive_ptr 或 ATL 的 CComPtr 类。 我建议使用 shared_ptr,因为其他两个需要您自己实现引用计数。

What you describe is the classic COM pattern for object lifetime control. You need a smart pointer that keeps reference counter on the object - boost::shared_ptr, boost::intrusive_ptr or ATL's CComPtr class. I would suggest shared_ptr, as the other two will require your own implementation of the ref counting.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文