例题6-1:并行程序模拟(deque的使用)

本例题探讨并行程序的模拟,涉及程序的五种操作:赋值、打印、锁定、解锁和结束。每个程序有共享变量,操作时间各不相同,且存在并发控制。在执行过程中,只有一个程序能运行,其余程序在等待队列中按顺序排列。lock和unlock操作会影响程序执行顺序,lock会使程序进入阻止队列,unlock时阻止队列的程序返回等待队列。最终输出每个程序的运行结果,格式为程序编号和结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例题6-1:并行程序模拟
题意:
给定n个程序,每种程序有五种操作,分别为 var = constant(赋值),print var (打印), lock, unlock,end 变量用小写字母表示,初始化为0,为程序所公有(一个程序里对某个变量修改可以会影响其他程序里的这个变量),常数小于100(也就是说最多两位数)。每个时刻都只能有一个程序处于运行状态,其他的都在等待,上述五种操作用时分别是t1, t2, t3, t4, t5。运行中的程序每次最多能运行q个时间,当q个时间被用完后,它会被放在等待队列的尾部,然后再从首部取出一个程序运行,初始等待队列按输入顺序,
但是lock和unlock会改变顺序,它们总是成对出现,不会出现嵌套。如果某个程序已经执行了lock,后面还有程序执行lock,那么这个程序就会马上被放到一个阻止队列的尾部(当然如果运行时间还没用完也就浪费了)。当unlock结束后,阻止队列中的第一个程序进入等待队列的首部。问你程序的运行结果是什么,输出格式是第几个程序加冒号加空格加结果,两个相连的数据用空行隔开。

#include<iostream>
#include<string>
#include<string.h>
#include<cstdio>
#include<deque>
#include<vector>
#include<queue>
using namespace std;
const int MAXN=1005;
bool lock;
deque<int>qr;
queue<int>qw;
vector<string> sta[MAXN];
int var[26],p[MAXN],t[MAXN];
int Q;
void run(int i)
{
    int rt=Q,v;
    string cur;
    while(rt>0){
        cur=sta[i][p[i]];
        if(cur[2]=='='){
            rt-=t[0];
            v=cur[4]-'0';
            if(cur.size()==6)v=v*10+cur[5]-'0';
            var[cur[0]-'a']=v;
        }
        else if(cur[2]=='i'){
            rt-=t[1];
            printf("%d: %d\n",i,var[cur[6]-'a']);
        }
        else if(cur[2]=='c'){
            rt-=t[2];
            if(lock){
                qw.push(i);
                return;
            }
            else lock=true;
        }
        else if(cur[2]=='l'){
            lock=false;
            rt-=t[3];
            if(!qw.empty()){
                v=qw.front();
                qw.pop();
                qr.push_front(v);
            }
        }
        else return;
        ++p[i];
    }
    qr.push_back(i);
}
int main()
{
    int cas;
    scanf("%d",&cas);
    while(cas--){
        int n;
        scanf("%d",&n);
        for(int i=0;i<5;i++)
            scanf("%d",&t[i]);
        scanf("%d",&Q);
        string s;
        for(int i=1;i<=n;i++){
            sta[i].clear();
            while(getline(cin,s)){
                if(s=="")continue;
                sta[i].push_back(s);
                if(sta[i].back()=="end")break;
            }
            qr.push_back(i);
        }
        memset(p,0,sizeof(p));
        memset(var,0,sizeof(var));
        while(!qr.empty()){
            int cur=qr.front();
            qr.pop_front();
            run(cur);
        }
        if(cas) printf("\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值