資源簡介
操作系統(tǒng)課程設(shè)計線程安全型隊列,利用讀者優(yōu)先機制實現(xiàn)互斥。

代碼片段和文件信息
#include?//C語言標(biāo)準(zhǔn)輸入輸出頭文件
#include?//動態(tài)存儲分配函數(shù)頭文件
#include?//標(biāo)準(zhǔn)庫頭文件(malloc()rand()srand()等等)
#include?//包含用于和宏指令的作用聲明與螺紋和過程一起使用的C標(biāo)頭文件(線程的創(chuàng)建和終結(jié)等等)
#include?//win32頭文件
#include?//日期和時間頭文件(用于隨機數(shù))
#include?//定義了通過控制臺進(jìn)行數(shù)據(jù)輸入和數(shù)據(jù)輸出的函數(shù)的頭文件(getch())
#include?//函數(shù)定義的頭文件
#define?_insert?1//1標(biāo)識為插入
#define?_delete?0//0標(biāo)識為刪除
#define?sum?64//定義線程運行總次數(shù)
volatile?int?readcount=0;//初始化讀者數(shù)目
int?thread=0;//初始化當(dāng)前線程總數(shù)
int?thread_find=1;//初始化當(dāng)前查找線程總數(shù)
int?thread_insert=1;//初始化當(dāng)前插入線程總數(shù)
int?thread_delete=1;//初始化當(dāng)前刪除線程總數(shù)
int?yes=0;
HANDLE?RC_Mutex;//控制讀者數(shù)量readcount的互斥訪問量
HANDLE?WR_Mutex;//控制讀寫互斥,寫寫互斥的信號量
typedef?int?QElemType;??//定義元素類型??
//******定義隊列的結(jié)點結(jié)構(gòu)******//
typedef?struct?QNode{??
????QElemType?data;//定義數(shù)據(jù)?
????struct?QNode?*next;?//定義指針
}QNode*QN;
//******定義隊列的結(jié)構(gòu)******//
typedef?struct?QType{??
QN?front;//定義隊頭指針??
QN?rear;//定義隊尾指針
}QTypeQT;
//******定義線程的結(jié)構(gòu)******//
struct?ThreadInfo?
{
QT?Queue;//定義隊列
QElemType?e;//定義查找元素
int?sort;??//線程類別
};
//******初始化一個空的隊列并創(chuàng)建隊列******//
void?InitQueue(QT?&Q)
{
//***初始化一個隊列***//
Q.front=Q.rear=(QN)malloc(sizeof(QNode));//分配動態(tài)存儲空間
????if(!(Q.front))??
exit(1);??
????Q.front->next=0;?//清空隊頭指針?
printf(“隊列初始化成功!\n“);
//***創(chuàng)建一個隊列***//
int?ilengthnum;?//定義隊列長度length,隊列元素num
????QN?p;//定義結(jié)點p
printf(“請輸入隊列長度:“);
scanf(“%d“&length);//設(shè)置隊列長度
srand((unsigned)time(NULL));//設(shè)置隨機數(shù)種子
????for(i=0;i ????{??
p=(QN)malloc(sizeof(QNode));?//分配動態(tài)存儲空間?
if(!p)
exit(1);? ????
????num=rand()%10000;//隨機產(chǎn)生隊列元素??????????
p->data=num;??
p->next=0;??
Q.rear->next=p;??
Q.rear=p;??
?????}??
?????yes=1;??
}
//******在隊列尾部加入一個結(jié)點******//
char?EnQueue(QT?&QQElemType?e)
{
if(Q.front==Q.rear)//判斷隊列是否為空
{
printf(“隊列為空,無法進(jìn)行操作!!!“);
return?-1;??//隊列為空,返回-1
}
QN?p;??
p=(QN)malloc(sizeof(QNode));//申請新結(jié)點??
????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;
}
//******刪除隊列頭部結(jié)點******//
char?DeQueue(QT?&QQElemType?e)
{
QN?p;??
if(Q.front==Q.rear)//判斷隊列是否為空
{
printf(“隊列為空,無法進(jìn)行操作!!!“);
return?-1;??//隊列為空,返回-1
}
p=Q.front->next;//指向頭結(jié)點??
e=p->data;??
Q.front->next=p->next;?//刪除隊列頭結(jié)點?
if(Q.rear==p)??
Q.rear=Q.front;??
free(p);?//釋放p的物理內(nèi)存?
return?e;//利用e返回其值
}
//******刪除隊列中的所有結(jié)點******//
void?Clear(QT?&Q)
{
QN?p=Q.front;//隊首指針賦給p
while(p!=NULL)
{
Q.front=Q.front->next;
free(p);
p=Q.front;
}//利用循壞,依次刪除隊列中的每一個結(jié)點,最后使隊首指針為空
Q.rear=NULL;
printf(“隊列已經(jīng)清空!\n“);
}
//******查找隊列中是否有指定的元素,若有,返回能夠訪問該結(jié)點的指針;若無,返回NULL。******//
QN?Find(QT?QQElemType?e)
{
QN?p=Q.front->next;??//定義一個指針p,位于隊列頭指針的位置
????if(Q.front==Q.rear)
{
printf(“隊列為空,無法進(jìn)行操作!!!\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
評論
共有 條評論