资源简介
操作系统课程设计线程安全型队列,利用读者优先机制实现互斥。
代码片段和文件信息
#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
- 上一篇:网络系统集成课程设计
- 下一篇:密码弱口令字典完整
相关资源
- 网络系统集成课程设计
- 数据库课程设计(医院管理系统)
- 中小企业网络规划与设计
- 数据结构课程设计n皇后问题的代码实
- 多级反馈队列调度算法实现
- 学生选修课系统课程设计报告
- 利用栈和队列实现后缀表达式转中缀
- 单片机课程设计电子时钟
- 基于ZigBee + HXD019D 的万能红外转发器
- Multisim10波形发生器电路设计
- 2PSK调制与解调系统的仿真_电子通信类
- 软件工程课程设计学生信息管理系统
- 嵌入式系统课程设计报告
- 嵌入式系统设计课程设计
- 广工数据库课程设计
- 通信原理课程设计任务
- 洗衣机PLC控制梯形图
- 医院排队系统课程设计报告
- acllib.rar
- 计组16位ALU课程设计
- 软件工程课程设计——图书管理系统
- 面向对象建模技术课程设计
- 模拟磁盘文件系统实现(内有详细注
- 操作系统课程设计页面置换算法
- 微机原理课程设计_电子密码锁
- UML建模课程设计
- 操作系统课程设计报告-建立基于磁盘
- 数据仓库与数据挖掘课程设计
- 广工计算机图形课程设计2015
- 单词处理程序
评论
共有 条评论