Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 发布/订阅和智能指针_C++_Smart Pointers_Publish Subscribe - Fatal编程技术网

C++ 发布/订阅和智能指针

C++ 发布/订阅和智能指针,c++,smart-pointers,publish-subscribe,C++,Smart Pointers,Publish Subscribe,我想实现一个简单的发布/订阅模式,其中: 单个发布者向其订阅服务器发布令牌(指向对象的指针)。发布者和订阅者都是独立的线程。我计划将线程安全队列添加到每个订阅服务器,以便Publisher可以在订阅服务器处理令牌时继续将令牌分发给订阅服务器 如您所见,这意味着所有订阅者实际上共享相同的指针(注意:订阅者无论如何都不能修改所指向的对象,因此没有问题)。一旦共享指针不再被任何订阅者使用,如果指针能够在最后一个订阅者线程完成后自动删除它自己,那就太好了 这是使用智能指针的好地方吗?如果是,我应该使用哪

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

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

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

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


我使用MSVC2008在Windows上开发,使用的是Intel TBB、Boost和Qt。

如果我认为您的设计是可行的(它在零上下文环境下闻起来很有趣,但很可能是正确的),Boost::shared_ptr可能是一个不错的选择


编辑:切换到::共享\u ptr from::弱\u ptr,因为我是个白痴…

您描述的是用于对象生命周期控制的经典COM模式。您需要一个智能指针,它将引用计数器保持在对象或ATL的类上。我建议
shared\u ptr
,因为其他两个将需要您自己实现ref计数。

boost::weak\u ptr不适用于他的场景,除非发布者保证在最后一个订阅者完成之前保持对象的活动状态。对于异步队列,这是不可行的。@Franci Penov:+1获取您的答案和评论。boost smart_ptr文档的链接是一件让我不认为这一点没有帮助的事情。啊,你说得对。我被提高线程安全性的想法所吸引,完全忘记了整个“它实际上没有包含引用”的问题!