并行程序模拟

Posted markkobs-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并行程序模拟相关的知识,希望对你有一定的参考价值。

任务介绍

你的任务是模拟n个程序的并行运算。(按照输入编号为1~n)的并行执行。

代码实现

#define LOCAL
#include<bits/stdc++.h>
using namespace std;
int main(){
    #ifdef LOCAL
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    #endif // LOCAL
    int n,t[5],Q;
    scanf("%d%d%d%d%d%d%d",&n,&t[0],&t[1],&t[2],&t[3],&t[4],&Q);
    unordered_map<char,int>variable;//变量与其值的映射关系
    deque<int>block,wait;//阻塞队列、等待队列
    bool lock=false;//锁
    vector<deque<string>>program(n+1);//每个程序
    for(int i=1;i<=n;++i){//读取每个程序代码
        wait.push_back(i);//。初始等待队列包含按输入顺序排列的各个程序
        string line;
        while(getline(cin,line)&&line!="end")
            program[i].push_back(line);
        program[i].push_back("end");
    }
    while(!wait.empty()){//等待队列不空就继续循环
        int cur=wait.front();//读取当前运行的程序
        wait.pop_front();
        if(program[cur].empty())//当前程序已运行完毕,不再执行任何操作
            continue;
        wait.push_back(cur);//将当前运行的程序插入到等待队列末尾
        for(int time=0;time<Q;){//当前程序运行时间小于配额时继续执行
            string s=program[cur].front();//读取需要执行的指令
            program[cur].pop_front();//弹出队首指令
            if(s[2]=='='){//是赋值指令
                variable[s[0]]=stoi(s.substr(4));//更新或插入变量及其对应值
                time+=t[0];//更新当前程序运行时间
            }else if(s[2]=='i'){//是print指令
                printf("%d: %d
",cur,variable[s[6]]);//打印
                time+=t[1];//更新当前程序运行时间
            }else if(s[2]=='c'){//是lock指令
                if(lock){//已经上锁了
                    program[cur].push_front(s);//当前指令重新压回队首
                    block.push_back(cur);//当前程序插入到阻塞队列队尾
                    wait.pop_back();//将当前程序从等待队列末尾中删除
                    break;//不再执行其他指令
                }//没有上锁过
                lock=true;//上锁
                time+=t[2];//更新当前程序运行时间
            }else if(s[2]=='l'){//unlock指令
                lock=false;//解除上锁
                time+=t[3];//更新当前程序运行时间
                if(!block.empty()){//阻塞队列不空
                    wait.push_front(block.front());//将阻塞队列队首程序插入到等待队列队首
                    block.pop_front();//弹出阻塞队列队首程序
                }
            }else if(s[2]=='d')//end指令
                break;//直接跳出循环
        }
    }
    return 0;
}

以上是关于并行程序模拟的主要内容,如果未能解决你的问题,请参考以下文章

[工作积累] UE4 并行渲染的同步 - Sync between FParallelCommandListSet & FRHICommandListImmediate calls(代码片段

Sleep() 方法后的代码片段没有被执行

google-map 片段应用程序在模拟器中崩溃后打开 WebView 活动

ViewPager的两个片段并行运行

6-1 并行程序模拟 uva210

使用 NS3 和 std::thread 进行并行模拟