C中的多缓冲管理

时间:2012-02-17 23:58:09

标签: c buffer eventmachine

你建议我在C中缓冲多个流(每个流需要它自己的缓冲区)吗?

有点在我脑海中汇总了一个解决方案:

这是理论上的“伪代码”

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

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

{
    stream_id
    buff_ptr
}

stream_id是流的ID(我有该信息),buff_ptr是指向某些malloc ed数据的指针。此外,缓冲区可能必须是灵活的,它必须调用mallocfree以使其灵活(至少我认为它会吗?< / p>

我基本上会通过遍历ptr s。

的数组找到我需要的缓冲区

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

如果有人想知道“为什么nyan她需要那个?!”我做了用Ruby / EventMachine的服务器,该协议是真烂(至少可以这样说),我不知道该怎么处理呢?除非有办法迫使EventMachine的缓冲对我来说,那我想是最佳解决方案。

感谢。

P.S:很抱歉! 〜

2 个答案:

答案 0 :(得分:1)

嗯,这似乎是唯一的选择,但你可以改变一些事情:

  • 请勿mallocfree。请改用realloc
  • 迭代列表可能没问题但是如果有很多缓冲区

    • 你能让调用者通过你指向缓冲区的指针吗?
    • 您可以使用哈希而不是列表并按stream_id搜索吗?例如glib2 provides such a hash

许多API(例如epoll)允许您将指针与id(epoll中的描述符)相关联。当该ID发生有趣的事情时,API会将指针传递给您 - &gt;以零4-8字节的内存为代价进行零搜索。

答案 1 :(得分:0)

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

只需定义一些回调并为读写池创建一些缓冲区。只要在缓冲区填满或耗尽时阻塞或跳过读写操作,这些池的大小就可以保持静态。