您的位置:首页 > 其它

生产者消费者模型,循环队列实现

2014-07-14 14:07 148 查看
说明:

1. 其中涉及互斥量和信号量的部分注释掉了, 加上就是多线程版本。

2. 消息数量超出循环队列长度时会被丢弃,如果不丢弃,需要使用信号量做等待操作。

3. 该队列可能存在一个数值溢出问题,即处理的消息数量超出整形值的问题。

#define QUEUE_LEN 1024

typedef struct ObjectListCell
{
int			size;
void*		value;
} ObjectListCell;

typedef struct ObjectList
{
ObjectListCell *queue;
int head;
int tail;
int len;
int mask;
//pthread_mutex_t mutex;
//SemaphoreData sema;
} ObjectList;

ObjectList*
object_list_create()
{
ObjectList * list = (ObjectList*)malloc(sizeof(ObjectList) +
QUEUE_LEN * sizeof(ObjectListCell));

list->head = list->tail =0;
list->len = QUEUE_LEN;
list->mask = QUEUE_LEN - 1;
list->queue = (ObjectListCell*)((char*)list + sizeof(ObjectList));

//InitMutex(&(list->mutex));
//SemaphoreInit(&list->sema, 0);

return list;
}

int
object_list_push(ObjectList* list, void * object, int size)
{
void *value;

if(object == NULL )
return 0;

//LockMutex(&list->mutex);

if(list->tail - list->head < list->len)
{
value = malloc(size);
memcpy(value, object, size);
list->queue[list->tail & list->mask].size = size;
list->queue[list->tail & list->mask].value = value;
list->tail ++;

//LSemaphorePost(&list->sema);
}

//UnLockMutex(&list->mutex);

return 1;
}

int
object_list_pop(ObjectList* list, void * object, int *size)
{
if(object == NULL )
return 0;

//LockMutex(&list->mutex);
if(list->tail == list->head)
{
list->tail = list->head = 0;
}

//UnLockMutex(&list->mutex);

//LSemaphoreWait(&list->sema, true);

//LockMutex(&list->mutex);

memcpy(object, list->queue[list->head & list->mask].value, list->queue[list->head & list->mask].size);
if(size)
*size = list->queue[list->head & list->mask].size;

free(list->queue[list->head & list->mask].value);

list->queue[list->head & list->mask].value = NULL;
list->queue[list->head & list->mask].size = 0;

list->head++;

//UnLockMutex(&list->mutex);

return 1;
}

void
object_list_free(ObjectList *list)
{
while (list->head > list->tail)
{
free(list->queue[list->head++].value);
}

free(list);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: