Concurrency Simulator

PS:这道题目,看懂题意就费了好大功夫。跟着RuJia的程序走了一遍,调试了一遍才明白个大概,只能说基础不是很好,还需要大量的时间学习。

PS:因为该题排版较麻烦,这里给出OJ网址:UVa210 - Concurrency Simulator


你的任务是模拟n个程序(按输入顺序编号为1~n)的并行执行。每个程序包含不超过25条语句,格式一共有5种:

  • var = constant(赋值);
  • print var(打印);
  • lock;
  • unlock;
  • end。

变量用单个小写字母表示,初始为0,为所有程序公有(因此在一个程序里对某个变量赋值可能会影响另一个程序)。常数是小于100的非负整数。

每个时刻只能有一个程序处于运行态,其他程序均处于等待态。上述5种语句分别需要t1、t2、t3、t4、t5单位时间。运行态的程序每次最多运行Q个单位时间(称为配额)。当一个程序的配额用完之后,把当前语句(如果存在)执行完之后该程序会被插入一个等待队列中,然后处理器从队首取出一个程序继续执行。初始等待队列包含按输入顺序排列的各个程序,但由于lock/unlock语句的出现,这个顺序可能会改变。

lock的作用是申请对所有变量的独占访问。lock和unlock总是成对出现,并且不会嵌套。lock总是在unlock的前面。当一个程序成功执行完lock指令之后,其他程序一旦试图执行lock指令,就会马上被放到一个所谓的阻止队列的尾部(没有用完的配额就浪费了)。当unlock执行完毕后,阻止队列的第一个程序进入等待队列的首部。

/**pid:进程编号id[pid]:该进程执行到的指令位置prog[id[pid]]:该指令位置对应的指令内容
**/
#include <cstdio>
#include <queue>
#include <cstring>
#include <cctype>
using namespace std;const int maxNum = 1005;// n个进程
int n;
// 表示5个指令所花的时间
int times[5];
// 周期时间
int quantum;
// 26个变量
int val[26];
// 指令
char prog[maxNum][10];
// 值为进程运行在指令的位置
int id[maxNum];
// 就绪队列
deque<int> readyQ;
// 阻塞队列
queue<int> blockQ;
// 锁
bool locked;// 执行指令
void run(int pid) {// 周期时间int q = quantum;while(q > 0) {// 获取指令char *p = prog[id[pid]];switch(p[2]) {// 举例 a = 22case '=' : {// 常量为正整数,且小于100val[p[0] - 'a'] = isdigit(p[5]) ? (p[4] - '0') * 10 + (p[5] - '0') : p[4] - '0';q -= times[0];break;}// 举例 print acase 'i' : {printf("%d: %d\n", pid + 1, val[p[6] - 'a']);q -= times[1];break;}// 举例 lockcase 'c' : {// 已lock,则将进程加入阻塞队列if(locked) {blockQ.push(pid);return;}// 上锁locked = true;q -= times[2];break;}// 举例 unlockcase 'l' : {// 解锁locked = false;// 当阻塞队列不为空,则将阻塞队列的第一个加入到就绪队列的第一个if(!blockQ.empty()) {int pid2 = blockQ.front();blockQ.pop();readyQ.push_front(pid2);}q -= times[3];break;}// endcase 'd' : {return;}}// 找到该进程的下一条指令id[pid]++;}// 将该进程加入到执行队列最后readyQ.push_back(pid);
}int main() {// T组用例int T;scanf("%d", &T);while(T--) {scanf("%d%d%d%d%d%d%d\n", &n, &times[0], &times[1], &times[2], &times[3], &times[4], &quantum);memset(val, 0, sizeof(val));// 表示第几行指令int line = 0;// 为每个进程提供一些指令for(int i = 0; i < n; i++) {// 读取一行放入指令数组fgets(prog[line++], maxNum, stdin);// 初始化每一个进程在指令数组的开始位置id[i] = line - 1;// 指令不为end,再读取一行指令while(prog[line - 1][2] != 'd') {fgets(prog[line++], maxNum, 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;
}

210 - Concurrency Simulator相关推荐

  1. 【日常学习】【双端队列】 Uva - 210 Concurrency Simulator题解

    ruka也的确是个小恶魔一般的东西,双端队列竟然只提了一句让我们自己去查TUT比人痛心疾首学习了众多网上神犇们的文章,终于知道了个大概.有几篇整理得非常精妙的文章,在这里给大家分享一下. http:/ ...

  2. UVA - 210:Concurrency Simulator

    题目链接:https://vjudge.net/problem/UVA-210 题目分析 就是一道模拟题,但是细节有点多. 写代码两个小时,调试代码用了两天...很长时间不刷题了,这道虽然算法简单但是 ...

  3. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  4. ICPC程序设计题解书籍系列之一:刘汝佳:《算法竞赛入门经典》(第2版)

    题是书中的题,部分解法参照了书中的解法,不少解法都做了简化和改进. 做程序,就要努力做到自己的程序是最好的! 第3章 数组和字符串(例题) POJ1488 UVA272 UVALive5381 TEX ...

  5. c 语言写数独游戏,经典数独游戏+数独求解器—纯C语言实现

    [转]NGUI研究院之三种方式监听NGUI的事件方法(七) NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直 ...

  6. 《算法竞赛入门经典(第2版)》——学习记录

    前言:   这里主要记录本人在学习紫书过程中充分理解过的题目的AC代码,便于以后回顾时查找代码和思路,毕竟看别人的真的有点难懂.此外,本书甚至是本书之外的相关知识学习也可能在此留下记录.   作为一只 ...

  7. Autoware 1.14(WSL2) 与LG SVL Simulator(Win11)联合仿真

    参考Couldn't find executable named rqt_lgsvl_simulator_configurator below /home/autoware/Autoware/ros/ ...

  8. 并发 vs 并行 (Concurrency Is Not Parallelism)

    前言 不知你是否曾经下列这些疑问? 并发与并行性有何关系? 什么是同步和异步执行? 如何区分并发与并行? 线程如何与所有这些概念一起使用? 并发 并发性意味着应用程序同时(并发地)在多个任务上取得进展 ...

  9. autoware中lgsvl Simulator安装与使用:LGsvl Simulator 2021.2.1版(九)

    autoware安装与使用:LGsvl Simulator 2021.2.1版(windows10)(九) 介绍如何在windows下安装LGsvl Simulator 2021.2.1版 环境:wi ...

最新文章

  1. 用命令行非交互改密码
  2. QueryRunner 错误
  3. python写学生系统-用python编写学生管理系统
  4. java在类中创建一个对象_在另一个类中创建类对象
  5. 【MySQL】Path does not chain with any of the trust anchors
  6. Linux调度器 - deadline调度器
  7. 试卷分析计算机基础,计算机基础试卷分析.doc
  8. java封装与调用方法_java方法和封装
  9. docker 启动时错误docker: Cannot connect to the Docker daemon
  10. 人体3D重建-ICON论文解读
  11. 天猫双十一自动刷喵币
  12. 微信小程序开发初体验
  13. 中国区GPS偏移纠正(适用于Google地图)
  14. 关于Springboot中跨域问题的解决(Response to preflight request doesn‘t pass access control check)
  15. LintCode 2017 光棍节
  16. 针织厂计算机社会实践报告,大学生寒假针织厂打工实践报告
  17. Angular常用ng指令详解
  18. msvcp120.dll一键下载修复-提示找不到msvcp120.dll的解决方法
  19. mysql drop后回收站怎么恢复_回收站清空了怎么恢复
  20. Windows7共享WIFI上网

热门文章

  1. ERROR: Unrecognized command line argument: #39;use#39;
  2. while语句的使用
  3. 前端 网络安全 前端优化 代码架构 笔记
  4. 漫画 |《程序员十二时辰》,内容过于真实 ...
  5. C 语言实例 -求分数数列1/2+2/3+3/5+5/8+...的前n项和
  6. 百度在线解析站不限速下载
  7. C#LeetCode刷题之#409-最长回文串(Longest Palindrome)
  8. C#LeetCode刷题之#643-子数组最大平均数 I( Maximum Average Subarray I)
  9. git命令升级版用法
  10. 云服务器 存放 文件夹,云服务器 存放 文件夹