UVA210题解

本文介绍了UVA210题目的解决方案,涉及程序并行执行的模拟,包括队列管理、锁机制和时间分配。文章阐述了如何处理并发中的锁冲突,并使用双端队列解决阻止队列的问题,确保程序的顺序执行。
摘要由CSDN通过智能技术生成

题意

本题要求模拟n个程序的并行执行,每个程序按照输入的顺序编号为1~n,每个程序包含不超过25条语句,格式一共有五种,赋值,打印,lock,unlock和end。变量被所有的程序共用,用单个小写字母表示,初值为0,常数都是不超过100的整数。
每个时刻只能有一个程序在执行,其他程序处于等待状态,不同的语句执行所需要的时间不同,上述的五种语句所需时间为t1,t2,t3,t4,t5,程序的一次执行最多配给Q个单位的时间,如果时间用尽,则执行完当前语句之后,程序会被插入到一个等待队列尾部,处理器会从等待队列的队首拿出一个程序继续执行。初始等待队列就是按照输入的顺序排列的。
赋值语句将变量赋值成给定的常数,打印语句将变量的值输出。而lock和unlock语句的作用,则是申请对变量的独占访问。当程序A的lock指令被执行,就不能执行其他程序的lock指令,如果遇到其他程序的lock指令,则将这个程序停止执行,送入一个阻止队列的尾部。当A的unlock执行完毕之后,阻止队列的第一个程序进入等待队列的首部。
输入五种语句的用时和Q,以及n个程序的内容,输出print语句所在的程序编号和它们的结果。

思路

显然需要两个队列,因为变量只能是单个小写字母,所以最多有26个。要按顺序去执行等待队列里面的程序,但是如果遇到lock指令怎么办?显然我们需要一个标记来指明是否有一个程序已经执行了lock指令,如果有,再遇到lock指令时我们应该把当前程序放入阻止队列。这个标记将在unlock指令执行之后复原。
还有一个问题,一旦一个程序的unlock被执行,阻止队列的程序将插入等待队列的首部,这里违背了队列只能插入尾部的规则,所以我们要用双端队列来实现等待队列。

代码

我最终的程序是用数组模拟了一个队列。当然也可以用queue和dequeue(双端队列)去实现。

#include<cstdio>
#include<string>
#include<queue>
#include<cstring>
using namespace std;

int n=3;
int t[5];
int Q;

int values[26];

int haslocked;

char p[1005][10];

int cur[100];

int waitq[100];
int stopq[100]; 
int waitq_front;
int waitq_rear;
int stopq_front;
int stopq_rear;

void runprogram
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值