生产者消费者模型,循环队列实现
2014-07-14 14:07
148 查看
说明:
1. 其中涉及互斥量和信号量的部分注释掉了, 加上就是多线程版本。
2. 消息数量超出循环队列长度时会被丢弃,如果不丢弃,需要使用信号量做等待操作。
3. 该队列可能存在一个数值溢出问题,即处理的消息数量超出整形值的问题。
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); }
相关文章推荐
- JAVA消费者与生产者模型的几个不同实现
- 生产者与消费者模型Linux下C语言的实现
- 从java多线程实现“生产者-消费者”模型来谈谈操作系统中线程状态的转换及线程同步的总结
- 生产者-消费者模型的3种Java实现:synchronized,signal/notifyAll及BlockingQueue
- 使用semaphore实现生产者-消费者简单模型
- java实现生产者消费者模型
- 生产者与消费者模型实现
- 生产者-消费者模型的Java实现
- 用生产者消费者模型实现的线程安全环形队列
- 基于线程实现的生产者消费者模型(Object.wait(),Object.notify()方法)
- Java实现生产者——消费者模型
- linux c pv 实现生产者消费者模型
- Win32信号量实现生产者消费者模型
- 基于线程实现的生产者消费者模型(Object.wait(),Object.notify()方法)
- 简单实现生产者、消费者模型
- JAVA实现多线程生产者消费者模型
- 简单实现带有数据缓冲池的生产者消费者模型
- JAVA实现多线程生产者消费者模型
- 学习笔记之----生产者-消费者模型的实现
- linux网络编程之System V 信号量(三):基于生产者-消费者模型实现先进先出的共享内存段