#include <ansi_c.h> #include <utility.h> typedef unsigned int elemType; /************************************************************************/ /* 以下是关于线程安全队列链接存储操作的9种算法 */ /************************************************************************/ struct result{ elemType data; int valid; //0表示返回结果无效 }; struct sNode{ elemType data; /* 值域 */ struct sNode *next; /* 链接指针 */ }; struct queueLK{ struct sNode *front; /* 队首指针 */ struct sNode *rear; /* 队尾指针 */ int maxnumber; /* 队列最多存储元素个数 */ int currentnumber; /* 队列当前存储元素个数 */ int lock; /* 锁---确保多线程安全 */ }; /* 1.初始化链队 */ void initQueue(struct queueLK *hq,int number) { hq->front = hq->rear = NULL; /* 把队首和队尾指针置空 */ if(number<=0) { number=0; /* 若为0,则此队列元素个数不设上限 */ } hq->maxnumber=number; /* 给队列设置最大元素个数 */ hq->currentnumber=0; /* 设置当前元素个数 */ CmtNewLock("",0,&(hq->lock)); return; } /* 2.从队列中删除一个元素 */ void outQueue(struct queueLK *hq,struct result *rs) { struct sNode *p; rs->valid=0; /* 若链队为空则停止运行 */ CmtGetLock(hq->lock); if(hq->front != NULL) { rs->data = hq->front->data; /* 暂存队尾元素以便返回 */ rs->valid=1; p = hq->front; /* 暂存队尾指针以便回收队尾结点 */ hq->front = p->next; /* 使队首指针