免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10202 | 回复: 10
打印 上一主题 下一主题

[C] 读写环形缓冲区的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-29 20:13 |只看该作者 |倒序浏览
结构体里定义了读指针和写指针,怎么样通过这2个指针来计算出缓冲区里是满的,是空的,或者还有多少剩余的空间啊?
菜鸟求助饿

谢谢饿

论坛徽章:
0
2 [报告]
发表于 2010-04-29 21:09 |只看该作者
你指谁的缓冲区啊???
问题要具体点。。。。

论坛徽章:
0
3 [报告]
发表于 2010-04-29 23:12 |只看该作者

论坛徽章:
0
4 [报告]
发表于 2010-04-30 08:55 |只看该作者
环形缓冲区是用数组定义的。。如char buf[1024],每次允许读写len长度的字节,
怎么用读写指针计算缓冲区的剩余空间呢?

论坛徽章:
0
5 [报告]
发表于 2010-04-30 09:06 |只看该作者
如果每次不是定长,就另设一个len变量啦

论坛徽章:
0
6 [报告]
发表于 2010-04-30 09:11 |只看该作者
没写过,但想了一下,提供几点思路给LZ,希望对你有帮助
1,读指针等于写指针地址表示缓冲区为空
2,判断缓冲区是否满可以用写指针加1然后取模,判断是否
等于读指针来确定缓冲区是否满。
3,缓冲区还剩多少空闲空间,此处分为三种情况,1),读指针
所在地址等于写指针所在地址;2),写指针地址大于读指针地址;
3),写指针地址小于读指针地址。三种情况缓冲区的剩剩余大小,
LZ你画个图就明白了
需要注意的地址:进行一次读写缓冲区时,所读写的大于不能大于缓冲区的大小

论坛徽章:
0
7 [报告]
发表于 2010-04-30 10:43 |只看该作者
也可以叫头指针和尾指针。
刚开始的时候缓冲区为空,头尾指针紧贴在一起。
写操作 : 尾指针前进。
读操作 : 头指针前进。
写阻塞 : 尾指针前进到头指针位置。
读阻塞 : 头指针前进到尾指针位置。

论坛徽章:
0
8 [报告]
发表于 2010-04-30 12:50 |只看该作者
LZ你在用环形缓冲区做什么东西,我也想学习一下!

论坛徽章:
0
9 [报告]
发表于 2010-04-30 14:25 |只看该作者
#include <sys/queue.h> //BSD系统下的, 如果其他平台没有此文件直接拿来用即可
......

  1. /*
  2. * Circular queue definitions.
  3. */
  4. #define CIRCLEQ_HEAD(name, type)                                        \
  5. struct name {                                                                \
  6.         struct type *cqh_first;                /* first element */                \
  7.         struct type *cqh_last;                /* last element */                \
  8. }

  9. #define CIRCLEQ_HEAD_INITIALIZER(head)                                        \
  10.         { CIRCLEQ_END(&head), CIRCLEQ_END(&head) }

  11. #define CIRCLEQ_ENTRY(type)                                                \
  12. struct {                                                                \
  13.         struct type *cqe_next;                /* next element */                \
  14.         struct type *cqe_prev;                /* previous element */                \
  15. }

  16. /*
  17. * Circular queue access methods
  18. */
  19. #define        CIRCLEQ_FIRST(head)                ((head)->cqh_first)
  20. #define        CIRCLEQ_LAST(head)                ((head)->cqh_last)
  21. #define        CIRCLEQ_END(head)                ((void *)(head))
  22. #define        CIRCLEQ_NEXT(elm, field)        ((elm)->field.cqe_next)
  23. #define        CIRCLEQ_PREV(elm, field)        ((elm)->field.cqe_prev)
  24. #define        CIRCLEQ_EMPTY(head)                                                \
  25.         (CIRCLEQ_FIRST(head) == CIRCLEQ_END(head))

  26. #define CIRCLEQ_FOREACH(var, head, field)                                \
  27.         for((var) = CIRCLEQ_FIRST(head);                                \
  28.             (var) != CIRCLEQ_END(head);                                        \
  29.             (var) = CIRCLEQ_NEXT(var, field))

  30. #define CIRCLEQ_FOREACH_REVERSE(var, head, field)                        \
  31.         for((var) = CIRCLEQ_LAST(head);                                        \
  32.             (var) != CIRCLEQ_END(head);                                        \
  33.             (var) = CIRCLEQ_PREV(var, field))

  34. /*
  35. * Circular queue functions.
  36. */
  37. #define        CIRCLEQ_INIT(head) do {                                                \
  38.         (head)->cqh_first = CIRCLEQ_END(head);                                \
  39.         (head)->cqh_last = CIRCLEQ_END(head);                                \
  40. } while (0)

  41. #define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {                \
  42.         (elm)->field.cqe_next = (listelm)->field.cqe_next;                \
  43.         (elm)->field.cqe_prev = (listelm);                                \
  44.         if ((listelm)->field.cqe_next == CIRCLEQ_END(head))                \
  45.                 (head)->cqh_last = (elm);                                \
  46.         else                                                                \
  47.                 (listelm)->field.cqe_next->field.cqe_prev = (elm);        \
  48.         (listelm)->field.cqe_next = (elm);                                \
  49. } while (0)

  50. #define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {                \
  51.         (elm)->field.cqe_next = (listelm);                                \
  52.         (elm)->field.cqe_prev = (listelm)->field.cqe_prev;                \
  53.         if ((listelm)->field.cqe_prev == CIRCLEQ_END(head))                \
  54.                 (head)->cqh_first = (elm);                                \
  55.         else                                                                \
  56.                 (listelm)->field.cqe_prev->field.cqe_next = (elm);        \
  57.         (listelm)->field.cqe_prev = (elm);                                \
  58. } while (0)

  59. #define CIRCLEQ_INSERT_HEAD(head, elm, field) do {                        \
  60.         (elm)->field.cqe_next = (head)->cqh_first;                        \
  61.         (elm)->field.cqe_prev = CIRCLEQ_END(head);                        \
  62.         if ((head)->cqh_last == CIRCLEQ_END(head))                        \
  63.                 (head)->cqh_last = (elm);                                \
  64.         else                                                                \
  65.                 (head)->cqh_first->field.cqe_prev = (elm);                \
  66.         (head)->cqh_first = (elm);                                        \
  67. } while (0)

  68. #define CIRCLEQ_INSERT_TAIL(head, elm, field) do {                        \
  69.         (elm)->field.cqe_next = CIRCLEQ_END(head);                        \
  70.         (elm)->field.cqe_prev = (head)->cqh_last;                        \
  71.         if ((head)->cqh_first == CIRCLEQ_END(head))                        \
  72.                 (head)->cqh_first = (elm);                                \
  73.         else                                                                \
  74.                 (head)->cqh_last->field.cqe_next = (elm);                \
  75.         (head)->cqh_last = (elm);                                        \
  76. } while (0)

  77. #define        CIRCLEQ_REMOVE(head, elm, field) do {                                \
  78.         if ((elm)->field.cqe_next == CIRCLEQ_END(head))                        \
  79.                 (head)->cqh_last = (elm)->field.cqe_prev;                \
  80.         else                                                                \
  81.                 (elm)->field.cqe_next->field.cqe_prev =                        \
  82.                     (elm)->field.cqe_prev;                                \
  83.         if ((elm)->field.cqe_prev == CIRCLEQ_END(head))                        \
  84.                 (head)->cqh_first = (elm)->field.cqe_next;                \
  85.         else                                                                \
  86.                 (elm)->field.cqe_prev->field.cqe_next =                        \
  87.                     (elm)->field.cqe_next;                                \
  88. } while (0)

  89. #define CIRCLEQ_REPLACE(head, elm, elm2, field) do {                        \
  90.         if (((elm2)->field.cqe_next = (elm)->field.cqe_next) ==                \
  91.             CIRCLEQ_END(head))                                                \
  92.                 (head).cqh_last = (elm2);                                \
  93.         else                                                                \
  94.                 (elm2)->field.cqe_next->field.cqe_prev = (elm2);        \
  95.         if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) ==                \
  96.             CIRCLEQ_END(head))                                                \
  97.                 (head).cqh_first = (elm2);                                \
  98.         else                                                                \
  99.                 (elm2)->field.cqe_prev->field.cqe_next = (elm2);        \
  100. } while (0)
复制代码
很多开源代码都拿来用了

论坛徽章:
0
10 [报告]
发表于 2010-04-30 16:56 |只看该作者
小菜鸟,刚进公司。。很多需要学习。。
根据前辈们的帮忙,已经写出程序,看能编译过否。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP