首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多链队列

多链队列
EN

Stack Overflow用户
提问于 2011-08-25 09:20:13
回答 2查看 235关注 0票数 1

在网络项目中,我有多个对象,每个对象都有一个消息队列(链表)。每个对象也有几个客户端,并且每个客户端都有一个指向队列中节点的指针。当客户端接收到它的指针指向的消息时,它的指针指向队列中的下一条消息。现在,当所有客户端都收到一条消息时,我希望该消息被释放,这样它就不会占用内存。我通过让单独的线程遍历对象并删除不需要的消息来做到这一点,充当GC,但是有没有更好的方法呢?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-25 09:24:45

您也许能够使用引用计数来处理此问题。假设所有指向队列元素的指针都来自队列元素的外部(而不是队列元素之间),您可以在队列单元中存储指向它的指针数量的计数。每当你添加一个新的指针,你就会增加这个引用计数,只要程序的一部分使用了单元格,它就会丢弃引用计数,当引用计数达到零时就会释放它。这样,只要存在指向该单元的未完成指针,它就不会被释放,一旦对队列单元的最后一个引用被破坏,它就会被回收。你不需要单独的线程来做这件事。

票数 3
EN

Stack Overflow用户

发布于 2011-08-25 09:45:50

消息具有订阅者列表。

每次订阅者打开消息时,订阅者计数都会减少1。因此,您有一个线程在到处寻找订阅者计数= 0的消息。

这不是个好主意。

你应该建立一个对象删除队列。每次订阅者打开消息时,它都会检查订阅者计数。如果为零,则消息订阅者本身将消息提交到删除队列。现在,GC线程只需要监视删除队列。

为什么要费心去拥有一个计数器呢?消息订户列表是令牌的链接列表。每个订阅者与列表中的一个令牌相关联。令牌告诉订户有一条消息。

如果消息队列在网络上运行,则为每个订户生成一个令牌,并将该令牌链接到循环列表中。对于列表中的每个令牌,将生成相应的令牌以发送给订阅者。当订阅者请求消息检索时,它将其身份验证令牌提交给消息队列管理器。消息队列管理器验证令牌并允许订阅者访问消息,然后解除令牌与列表的链接。

无论是网络消息队列还是本地系统队列,当最后一个令牌解除链接(这是一个循环列表--您将知道它是最后一个令牌)时,消息将被提交到删除队列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7184122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档