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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shujiezhang/article/details/37760757

说明:

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);
}





猜你喜欢

转载自blog.csdn.net/shujiezhang/article/details/37760757
今日推荐