• 大小: 444KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-29
  • 语言: C/C++
  • 标签: 多线程  文件共享  

资源简介

使用c语言写的多线程读写文件的仿真程序,可以模拟多线程中Writer的独占性特性

资源截图

代码片段和文件信息

/*
开发环境:visual Studio 2015
其他开发环境未经测试
*/

using namespace std;
#include 
#include 
#include 
//***进程结构定义***//
struct process
{
int num;
string ProcessStatus;
int TimeChip;
};
//***队列节点定义***//
typedef struct QNode
{
process data;
struct QNode *next;
}QNode *QueuePrt;
//***队列结构定义***//
typedef struct
{
QueuePrt front rear; // 队头队尾指针
}linkQueue;
//***队列初始化操作***//
void initQuene(linkQueue *q)
{ //初始化队列 为队列分配内存
q->front = q->rear = new QNode;
if (q->front == nullptr)
exit(0);
q->front->next = nullptr;
}
//***入队列操作***//
void enqueue(linkQueue *q process &e)
{//入队列操作
QueuePrt p;
p = new QNode;
if (q == nullptr)
exit(0);
p->data = e;
p->next = nullptr;
q->rear->next = p;
q->rear = p;
}
//***出队列操作***//
void dequeue(linkQueue *q process &e)
{
QueuePrt p;
if (q->front == q->rear)
{//如果队列为空
return;
}
p = q->front->next;
e = p->data;
q->front->next = p->next;
if (q->rear == p) //如果队列为空
q->rear = q->front;
delete p;
}
//***遍历队列中元素并打印***//
void traversalQueue(const linkQueue &q)
{
QueuePrt p;
p = q.front;
while (p != q.rear )
{
p = p->next;
process d = p->data;
cout << “[“< }
cout <}
//***************************************//
int main()
{
linkQueue readyQueue chokeQueue; /*建立就绪队列、阻塞队列*/
initQuene(&readyQueue); /*初始化就绪队列*/
initQuene(&chokeQueue); /*初始化阻塞队列*/
//输入模块*********************************************//
int n; /*表示进程数*/
float Zp; /*表示进入阻塞状态的几率*/
cout <<“请输入并发进程数(10-20):“ < cin >> n;
cout <<“请输入进入阻塞状态概率(0-1):“< cin >> Zp;
//***生成进程并放入就绪队列***//
for (int i = 0; i != n;++i)
{
/*创建进程并初始化进程*/
process p;
p.num = i;
p.ProcessStatus = “ 就绪 “;
cout << “请输入进程 “ << i << “ 的时间片长度(整数) : “;
int l; /*表示进程时间片长度*/
cin >> l;
p.TimeChip = l;
/*将进程加入就绪队列*/
enqueue(&readyQueue p);
}
/*按下 空格 并回车表示过了一个时间片*/
char c; /*表示控制循环的字符*/
process pro; /*表示运行中的程序*/
while (cin.get(c) && (c==‘ ‘||c==10))
{/*进入一次循环 表示时间片变化一次*/
if (pro.ProcessStatus == “ 运行 “)
{/*上一时间片的进程在运行状态时*/
//完成操作当前程序进入就绪队列*****************//
cout << “进程“ << pro.num << “运行结束“ << endl;
if (--pro.TimeChip > 0)
{//若时间片长度大于0,回到就绪队列
pro.ProcessStatus = “就绪“;
enqueue(&readyQueue pro);
cout << “进程“ << pro.num << “回到“ << pro.ProcessStatus << “队列“ << endl;
}
else
cout << “进程“ << pro.num << “时间片长度为0,销毁进程“ << endl;
}
/*取出就绪队列进程到运行状态*/
if (readyQueue.front == readyQueue.rear)
{
cout<<“就绪队列为空,程序结束“< break;
}
dequeue(&readyQueue pro);
pro.ProcessStatus = “ 运行 “;
cout << “时间片+1,进程 “ << pro.num << “ 进入“ << pro.ProcessStatus << “状态“< /*
根据概率进入不同状态
根据输入概率确定本次运行队列行为
*/
srand(time(0));
float b = (rand() % 100) / (float)99;  /*产生0-1之间的随机数*/
if (b {/*依据所设置概率进入阻塞状态*/
if (--pro.TimeChip > 0)
{//若进程时间片长度不为0
pro.ProcessStatus = “

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        1149  2018-03-25 17:12  ReadMe.txt
     文件       58603  2018-03-25 17:15  测试截图.png
     目录           0  2019-03-18 21:40  要求\
     文件      402227  2018-05-01 12:00  要求\要求.png
     文件        4756  2018-03-25 16:59  进程.cpp

评论

共有 条评论