免费注册 查看新帖 |

Chinaunix

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

请大家看看我的循环队列(无锁)会有问题吗,只有一个生产线程一个读取线程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-14 10:32 |只看该作者 |倒序浏览
本帖最后由 iCoding 于 2010-08-14 11:07 编辑


  1. typedef struct apr_socket_queue
  2. {
  3.         int size;
  4.         int *base;
  5.         volatile int writer;
  6.         volatile int reader;
  7. }apr_socket_queue;

  8. #include "datatype.h"
  9. #include <stdlib.h>

  10. #define HEAD  0
  11. #define TRUE  1
  12. #define FALSE 0

  13. void create_queue(apr_socket_queue *queue,apr_config *pconfig)
  14. {
  15.         queue->size = pconfig->socket_number;
  16.         queue->base = (int*)malloc(sizeof(int)*pconfig->socket_number);
  17.         queue->writer  = HEAD;
  18.         queue->reader  = HEAD - 1;
  19. }

  20. int enqueue(apr_socket_queue *queue,int socket)
  21. {
  22.         if(queue->writer+1 != queue->reader && queue->writer < queue->size-1)
  23.         {
  24.                 queue->base[queue->writer] = socket;
  25.                 queue->writer++;
  26.                 return TRUE;
  27.         }

  28.         if(queue->writer == queue->size-1 && queue->reader > HEAD)
  29.         {
  30.                 queue->base[queue->writer] = socket;
  31.                 queue->writer = HEAD;
  32.                 return TRUE;
  33.         }

  34.         return FALSE;//the queue is full
  35. }

  36. int dequeue(apr_socket_queue *queue,int *socket)
  37. {
  38.         if(queue->reader+1 != queue->writer && queue->reader < queue->size-1)
  39.         {
  40.                 queue->reader++;
  41.                 *socket = queue->base[queue->reader];
  42.                 return TRUE;
  43.         }

  44.         if(queue->reader == queue->size-1 && queue->writer > HEAD)
  45.         {
  46.                 queue->reader = HEAD;
  47.                 *socket = queue->base[queue->reader];
  48.                 return TRUE;
  49.         }

  50.         return FALSE;// the queue is empty
  51. }


  52. void destroy_queue(apr_socket_queue *queue)
  53. {
  54.         free(queue->base);
  55.         queue->writer = HEAD;
  56.         queue->reader = HEAD -1;
  57.         queue->size = 0;
  58. }

复制代码

论坛徽章:
0
2 [报告]
发表于 2010-08-14 10:37 |只看该作者
使用的话,生成两个线程,一个生产线程一个消费线程,生产线程只会调用enqueue,消费线程条用dequeue,这样的话会出问题吗

论坛徽章:
0
3 [报告]
发表于 2010-08-14 10:42 |只看该作者
循环缓冲貌似只有在单一消费者和单一生产者才是数据安全的吧~多了都要加锁

论坛徽章:
0
4 [报告]
发表于 2010-08-14 10:49 |只看该作者
楼上说的对,当你的消费者是一个时,是可以这么用的。
如果有多个消费者,不加锁是不行的

论坛徽章:
0
5 [报告]
发表于 2010-08-14 10:49 |只看该作者
循环缓冲貌似只有在单一消费者和单一生产者才是数据安全的吧~多了都要加锁
wenkai169 发表于 2010-08-14 10:42



    我预计确实只有一个生产者一个消费者,所以才这么写

论坛徽章:
0
6 [报告]
发表于 2010-08-14 12:33 |只看该作者
加锁只多消耗10%性能,为啥不加锁呢?

论坛徽章:
0
7 [报告]
发表于 2010-08-15 16:30 |只看该作者
t起

论坛徽章:
0
8 [报告]
发表于 2010-08-16 12:16 |只看该作者
go on

论坛徽章:
0
9 [报告]
发表于 2012-02-10 11:27 |只看该作者
这个是有问题的,  始终都有一个节点读不出来, 就是writer最后一次写的节点.

论坛徽章:
0
10 [报告]
发表于 2012-02-10 11:34 |只看该作者
不好意思, 看错了, 是对的.....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP