打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C语言环形缓冲fifo实现

很有用的环形缓冲区,多线程间注意加锁,收藏下

  1. #define BUFFSIZE 1024 * 1024
  2. #define min(x, y) ((x) < (y) ? (x) : (y))
  3. pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
  4. struct cycle_buffer {
  5. unsigned char *buf;
  6. unsigned int size;
  7. unsigned int in;
  8. unsigned int out;
  9. pthread_mutex_t lock;
  10. };
  11. static struct cycle_buffer *fifo = NULL;
  12. static int init_cycle_buffer(void)
  13. {
  14. int size = BUFFSIZE, ret;
  15. ret = size & (size - 1);
  16. if (ret)
  17. return ret;
  18. fifo = (struct cycle_buffer *) malloc(sizeof(struct cycle_buffer));
  19. if (!fifo)
  20. return -1;
  21. memset(fifo, 0, sizeof(struct cycle_buffer));
  22. fifo->size = size;
  23. fifo->in = fifo->out = 0;
  24. pthread_mutex_init(&fifo->lock, NULL);
  25. fifo->buf = (unsigned char *) malloc(size);
  26. if (!fifo->buf)
  27. free(fifo);
  28. else
  29. memset(fifo->buf, 0, size);
  30. return 0;
  31. }
  32. unsigned int fifo_get(unsigned char *buf, unsigned int len)
  33. {
  34. unsigned int l;
  35. len = min(len, fifo->in - fifo->out);
  36. l = min(len, fifo->size - (fifo->out & (fifo->size - 1)));
  37. memcpy(buf, fifo->buf + (fifo->out & (fifo->size - 1)), l);
  38. memcpy(buf + l, fifo->buf, len - l);
  39. fifo->out += len;
  40. return len;
  41. }
  42. unsigned int fifo_put(unsigned char *buf, unsigned int len)
  43. {
  44. unsigned int l;
  45. len = min(len, fifo->size - fifo->in + fifo->out);
  46. l = min(len, fifo->size - (fifo->in & (fifo->size - 1)));
  47. memcpy(fifo->buf + (fifo->in & (fifo->size - 1)), buf, l);
  48. memcpy(fifo->buf, buf + l, len - l);
  49. fifo->in += len;
  50. return len;
  51. }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
linux内核数据结构之kfifo
Linux内核中的循环缓冲区
C 语言免拷贝版本循环 buffer 比拷贝版本快了近 10 倍!
GIT初始版源码解析
结构体指针赋值--ads编译器语法限制很死
透过 Linux 内核看无锁编程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服