【问题标题】:multiple buffer management in CC中的多缓冲区管理
【发布时间】:2012-03-09 09:01:19
【问题描述】:

您会建议我如何在 C 中缓冲多个流(每个流都需要自己的缓冲区)?

有点在我的脑海中提出了一个解决方案:

这是理论上的“伪代码”

[ptr, ptr, ptr, ptr ... ]

每个ptr 都是一个指向结构体的指针:

{
    stream_id
    buff_ptr
}

stream_id 是流的 ID(我有该信息),buff_ptr 是指向某些 malloced 数据的指针。此外,缓冲区可能必须灵活,并且必须多次调用 mallocfree 才能使其灵活(至少我认为会?

我基本上会通过遍历ptrs 的数组来找到我需要的缓冲区。


那么,那个“架构”好还是有更好的?

如果有人想知道“为什么 nyan 她需要那个?!”我在 Ruby/EventMachine 中创建了一个服务器,协议真的很烂(至少可以说),我不知道如何处理它......除非有办法强制 EventMachine 为我缓冲它,否则我想这将是最佳解决方案。

谢谢。

P.S: 很抱歉的狂欢! ~

【问题讨论】:

  • 如果stream_id 是从0N 的整数,您可以使用buff_ptr 的数组,而不必搜索structs 的列表来定位所需的流.
  • @hmjd 啊,不是。我一开始也以为是有时是,有时不是。这一切有点随机,真的。实际上,它几乎从不以 0 开头——现在我想起来了。
  • stream_id 是否有预定义范围?如果有,您可以使用稀疏数组。
  • @hmjd 不。据我所知,它通常从某个随机整数开始,然后递增,但它不会一直递增,有时它会随机地跳转到一个随机数,然后再次开始递增,依此类推。

标签: c buffer eventmachine


【解决方案1】:

嗯,这似乎是唯一的选择,但您可以更改一些内容:

  • 不要mallocfree。请改用realloc
  • 遍历列表可能没问题,但如果有很多缓冲区

    • 你能让调用者传递一个指向缓冲区的指针吗?
    • 您可以使用散列代替列表并按stream_id 搜索吗?例如glib2 provides such a hash

许多 API(例如 epoll)允许您将指针与 id(在 epoll 的情况下为描述符)相关联。当该 id 发生有趣的事情时,API 会将您的指针传递给您 -> 零搜索,但会占用 4-8 字节的内存。

【讨论】:

  • C 中有散列这样的东西吗?我不知道有! 这里是新手~
  • @withado。没有标准的。你可以自己实现,也可以使用现成的(例如glib2 hash)。
  • 哦。好想那个。有简单的“安装”吗?
  • @withado。取决于你的平台。如果您使用 Unix,那么您已经拥有它了。不太了解windows。
  • 我会将这个答案标记为已接受,因为 glib 是~天堂~,但在答案中也包括提到 Glib。因此,人们不必深入研究 cmets。 xo
【解决方案2】:

使用libev 创建一个简单的事件循环并让它处理轮询文件描述符。那里有很多例子,它的手册页 (man 3 libev) 是我读过的最好的之一。

只需定义一些回调并为您的读写池创建一些缓冲区。只要在缓冲区填满或耗尽时分别阻止或跳过读取和写入,这些池的大小就可以保持不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2022-01-03
    • 2017-07-12
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多