#include<iostream>
#include<map>
#include<deque>
#include<queue>
#include<vector>
#include<string>
#include<cstdio>
#include<cstdlib>
using namespace std;
vector<string> prog[11];
map<char,int> var;
deque<int> ready;
queue<int> blocked;
int runId,n,Q;
int itime[6];
int ip[11];
int locknum=0;
string s;
char index[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
'p','q','r','s','t','u','v','w','x','y','z'};
void init()
{
for(int i=0;i<26;i++)
var.insert( pair<char,int>(index[i],0));
for(int i=0;i<11;i++)
ip[i]=0;
}
void input()
{
cin>>n;
for(int i=0;i<5;i++)
cin>>itime[i];
cin>>Q;
getline(cin,s);
for(int i=0;i<n;i++){
ready.push_back(i);
while(true){
getline(cin,s);
prog[i].push_back(s);
if('e'==s[0])
break;
}
}
}
void excutei(string ins,int runId,int& t)
{
if(ins[2]=='='){
string sub=ins.substr(4);
sscanf(sub.c_str(),"%d",&var[ins[0]]);
t-=itime[0];
}else if('p'==ins[0]){
cout<<runId+1<<": "<<var[ins[6]]<<endl;
t-=itime[1];
}else if('u'==ins[0]){
int t=blocked.front();
blocked.pop();
ready.push_front(t);
locknum--;
t-=itime[3];
}else{
locknum++;
t-=itime[2];
}
}
void excutep(int runId)
{
int t=Q;
while(t>0){
string ins=prog[runId][(ip[runId])];
if('e'==ins[0])return;
if('l'==ins[0]){
if(locknum!=0){
blocked.push(runId);
return;
}
}
excutei(ins,runId,t);
ip[runId]++;
}
ready.push_back(runId);
}
void excute()
{
while(!ready.empty()){
runId=ready.front();
ready.pop_front();
excutep(runId);
}
}
int main()
{
int T;
cin>>T;
while(T--){
init();
input();
excute();
if(T)cout<<endl;
}
return 0;
}
210 - Concurrency Simulator
最新推荐文章于 2023-11-15 14:22:55 发布