资源简介

操作系统课程设计线程安全型队列,利用读者优先机制实现互斥。

资源截图

代码片段和文件信息

#include //C语言标准输入输出头文件
#include //动态存储分配函数头文件
#include //标准库头文件(malloc()rand()srand()等等)
#include //包含用于和宏指令的作用声明与螺纹和过程一起使用的C标头文件(线程的创建和终结等等)
#include //win32头文件
#include //日期和时间头文件(用于随机数)
#include //定义了通过控制台进行数据输入和数据输出的函数的头文件(getch())
#include //函数定义的头文件

#define _insert 1//1标识为插入
#define _delete 0//0标识为删除
#define sum 64//定义线程运行总次数

volatile int readcount=0;//初始化读者数目
int thread=0;//初始化当前线程总数
int thread_find=1;//初始化当前查找线程总数
int thread_insert=1;//初始化当前插入线程总数
int thread_delete=1;//初始化当前删除线程总数
int yes=0;

HANDLE RC_Mutex;//控制读者数量readcount的互斥访问量
HANDLE WR_Mutex;//控制读写互斥,写写互斥的信号量

typedef int QElemType;  //定义元素类型  

//******定义队列的结点结构******//
typedef struct QNode{  
    QElemType data;//定义数据 
    struct QNode *next; //定义指针
}QNode*QN;

//******定义队列的结构******//
typedef struct QType{  
QN front;//定义队头指针  
QN rear;//定义队尾指针
}QTypeQT;

//******定义线程的结构******//
struct ThreadInfo 
{
QT Queue;//定义队列
QElemType e;//定义查找元素
int sort;  //线程类别
};

//******初始化一个空的队列并创建队列******//
void InitQueue(QT &Q)
{
//***初始化一个队列***//
Q.front=Q.rear=(QN)malloc(sizeof(QNode));//分配动态存储空间
    if(!(Q.front))  
exit(1);  
    Q.front->next=0; //清空队头指针 
printf(“队列初始化成功!\n“);
//***创建一个队列***//
int ilengthnum; //定义队列长度length,队列元素num
    QN p;//定义结点p
printf(“请输入队列长度:“);
scanf(“%d“&length);//设置队列长度
srand((unsigned)time(NULL));//设置随机数种子
    for(i=0;i    {  
p=(QN)malloc(sizeof(QNode)); //分配动态存储空间 
if(!p)
exit(1);      
    num=rand()%10000;//随机产生队列元素          
p->data=num;  
p->next=0;  
Q.rear->next=p;  
Q.rear=p;  
     }  
     yes=1;  
}

//******在队列尾部加入一个结点******//
char EnQueue(QT &QQElemType e)
{
if(Q.front==Q.rear)//判断队列是否为空
{
printf(“队列为空,无法进行操作!!!“);
return -1;  //队列为空,返回-1
}
QN p;  
p=(QN)malloc(sizeof(QNode));//申请新结点  
    if(!p)
exit(1);    
Sleep(200);
e=rand();//随机插入元素
p->data=e;  
p->next=0;  
Q.rear->next=p;
Q.rear=p;
printf(“随机插入元素%d\n“&e);
return 1;
}

//******删除队列头部结点******//
char DeQueue(QT &QQElemType e)
{
QN p;  
if(Q.front==Q.rear)//判断队列是否为空
{
printf(“队列为空,无法进行操作!!!“);
return -1;  //队列为空,返回-1
}
p=Q.front->next;//指向头结点  
e=p->data;  
Q.front->next=p->next; //删除队列头结点 
if(Q.rear==p)  
Q.rear=Q.front;  
free(p); //释放p的物理内存 
return e;//利用e返回其值
}

//******删除队列中的所有结点******//
void Clear(QT &Q)
{
QN p=Q.front;//队首指针赋给p
while(p!=NULL)
{
Q.front=Q.front->next;
free(p);
p=Q.front;
}//利用循坏,依次删除队列中的每一个结点,最后使队首指针为空
Q.rear=NULL;
printf(“队列已经清空!\n“);
}

//******查找队列中是否有指定的元素,若有,返回能够访问该结点的指针;若无,返回NULL。******//
QN Find(QT QQElemType e)
{
QN p=Q.front->next;  //定义一个指针p,位于队列头指针的位置
    if(Q.front==Q.rear)
{
printf(“队列为空,无法进行操作!!!\n“);
exit(1);
}
else  
{
while(p)
{
e=rand();
if(p->data!=e)
{
p=p->next;//指针p下移
}
else

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件       12269  2018-06-15 00:22  QueueThread.cpp

评论

共有 条评论