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

来源:互联网 发布:xyz域名怎么样 编辑:程序博客网 时间:2024/06/05 11:43

说明:

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

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

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



#define QUEUE_LEN 1024typedef struct ObjectListCell{intsize;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;}intobject_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;}intobject_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;}voidobject_list_free(ObjectList *list){while (list->head > list->tail){free(list->queue[list->head++].value);}free(list);}





0 0
原创粉丝点击