本文共 1918 字,大约阅读时间需要 6 分钟。
说明:
1. 其中涉及互斥量和信号量的部分注释掉了, 加上就是多线程版本。
2. 消息数量超出循环队列长度时会被丢弃,如果不丢弃,需要使用信号量做等待操作。
3. 该队列可能存在一个数值溢出问题,即处理的消息数量超出整形值的问题。
#define QUEUE_LEN 1024typedef 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;}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);}
转载地址:http://hoyni.baihongyu.com/