+ -
当前位置:首页 → 问答吧 → 请大家看看我的循环队列(无锁)会有问题吗,在多线程环境

请大家看看我的循环队列(无锁)会有问题吗,在多线程环境

时间:2010-08-14

来源:互联网

  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. }
复制代码

作者: iCoding   发布时间: 2010-08-14

使用的话,生成两个线程,一个生产线程一个消费线程,生产线程只会调用enqueue,消费线程条用dequeue,这样的话会出问题吗

作者: iCoding   发布时间: 2010-08-14

循环缓冲貌似只有在单一消费者和单一生产者才是数据安全的吧~多了都要加锁

作者: wenkai169   发布时间: 2010-08-14

楼上说的对,当你的消费者是一个时,是可以这么用的。
如果有多个消费者,不加锁是不行的

作者: pdsxw123   发布时间: 2010-08-14



QUOTE:
循环缓冲貌似只有在单一消费者和单一生产者才是数据安全的吧~多了都要加锁
wenkai169 发表于 2010-08-14 10:42




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

作者: iCoding   发布时间: 2010-08-14