并行程序模拟,紫书P139UVa210

来源:互联网 发布:澳大利亚买车软件 编辑:程序博客网 时间:2024/06/05 15:23

本题是队列题目中难度较大的一道。题设的信息量很大,需要选手处理的问题也非常多。比较棘手。
本题关键问题:
1.每个程序所有指令的存储,以及正常非(lock)情况下的建队与执行。
2.程序运行时关于每条语句所占用的时间以及配额限制问题的处理。
3.关于lock情况的处理。

刘的代码关于以上的问题处理的非常巧妙,反复学习,反复学习:
1.用var数组记录字母。
2.用gro字符数组记录所有程序的所有指令,用ip[i]来标记i程序当前该执行的语句。
3.程序运行时关于每条语句所占用的时间以及配额限制问题的处理,采用先执行后减时间的方法。

语法要点:
1.deque<>:双端队列,可以直接通过push_front(pid2);执行队首插入操作。
2.isdigit(p[5]); 判断p[5]是否为0到9数字字符,位于头文件。

// UVa210 Concurrency Simulator// Rujia Liu#include<cstdio>#include<queue>#include<cstring>#include<cstdlib>#include<cctype>using namespace std;const int maxn = 1000;deque<int> readyQ;queue<int> blockQ;int n, quantum, c[5], var[26], ip[maxn]; bool locked;char prog[maxn][10];void run(int pid) {  int q = quantum;  while(q > 0) {    char *p = prog[ip[pid]];    switch(p[2]) {      case '=':        var[p[0] - 'a'] = isdigit(p[5]) ? (p[4] - '0') * 10 + p[5] - '0' : p[4] - '0';        q -= c[0];        break;      case 'i': // print        printf("%d: %d\n", pid+1, var[p[6] - 'a']);        q -= c[1];        break;      case 'c': // lock        if(locked) { blockQ.push(pid); return; }        locked = true;        q -= c[2];        break;      case 'l': // unlock        locked = false;        if(!blockQ.empty()) {          int pid2 = blockQ.front(); blockQ.pop();          readyQ.push_front(pid2);        }        q -= c[3];        break;      case 'd': // end        return;    }    ip[pid]++;  }  readyQ.push_back(pid);}int main() {  int T;  scanf("%d", &T);  while(T--) {    scanf("%d %d %d %d %d %d %d\n", &n, &c[0], &c[1], &c[2], &c[3], &c[4], &quantum);    memset(var, 0, sizeof(var));    int line = 0;    for(int i = 0; i < n; i++) {      fgets(prog[line++], maxn, stdin);      ip[i] = line - 1;      while(prog[line - 1][2] != 'd')        fgets(prog[line++], maxn, stdin);      readyQ.push_back(i);    }    locked = false;    while(!readyQ.empty()) {      int pid = readyQ.front(); readyQ.pop_front();      run(pid);    }    if(T) printf("\n");  }  return 0;}