博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生产者消费者模型,循环队列实现
阅读量:4073 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
NGUI: Next-Gen UI 2018.3.0f
查看>>
uSurvival 1.41多人在线生存逃杀吃鸡类游戏源码
查看>>
玩转@Git三剑客
查看>>
Unity实现c#热更新方案探究(一)
查看>>
uSurvival 1.41多人在线生存逃杀吃鸡类游戏源码
查看>>
AXURE RP8 - 实战手册 网站和APP原型制作案例精粹
查看>>
c#传不确定的参数个数,比如int型
查看>>
NGUI: Next-Gen UI 2018.3.0f
查看>>
玩转@Git三剑客
查看>>
Android 9.0 Http不能访问网络
查看>>
Android 9.0 Http不能访问网络
查看>>
Unity编辑器环境在Inspector面板中显示变量
查看>>
苹果IPhone真机开发调试
查看>>
UE4虚幻引擎独立游戏制作教程 UE4编程教学 虚幻引擎4
查看>>
revenue
查看>>
currency
查看>>
iTunes Connect上传APP屏幕快照图片失败 - 您必须上传有效的屏幕快照。
查看>>
receipt
查看>>
[教程] Packt - Create a Game Environment with Blender and Unity by Darrin Lile
查看>>
[教程] Packt - Create a Game Environment with Blender and Unity by Darrin Lile
查看>>