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. java_codereview随笔
  2. 宝塔需在php设置中安装redis扩展,wordpress开启Redis扩展教程
  3. angularjs中 $watch 和$on 2种监听的区别?
  4. java 窗口线程_Java 窗体与线程问题
  5. 案例 宠物医生给小动物看病 c# 1614100379
  6. STM32工作笔记0037---STM32时钟系统精讲-M3
  7. 欠20万信用卡卡奴自救方法
  8. android 右边抽屉,android – 抽屉在右侧抽屉中切换
  9. 终于有人把深度学习讲明白了!
  10. 智能优化算法(源码)-飞蛾扑火优化算法(MFO)
  11. iText实现html转pdf
  12. IDEA 实用小技巧:万能的临时文件
  13. 六一儿童节海报合集,一起重拾童年吧~
  14. 安装win7时,显示缺少所需的CD/DVD驱动器设备驱动程序
  15. asterisk注册河南联通ims
  16. zookeeper-集群-选举机制
  17. 谢烟客---------Linux之用户
  18. SSL证书的申请流程
  19. 使用Python连接crossbar.io 报错 could not create serializer for “cbor“ (available: [‘json‘])
  20. matlab d函数,Matlab常用函数

热门文章

  1. 使用adduser命令在Debian Linux中创建用户
  2. 如何在六个月或更短的时间内成为DevOps工程师(三):版本控制
  3. OSPF——优化技术(含配置)
  4. CCNA初认识——OSPF(开放式最短路径优先协议)配置命令
  5. TCP/IP五层模型(五层因特网协议栈)||| OSI参考模型|||数据的封装与解封装
  6. (草稿)如何判断一名UiPath开发人员是否合格?
  7. C#LeetCode刷题之#20-有效的括号(Valid Parentheses)
  8. 命令行部署程序保存pid到文件
  9. 从MySql 数据库中导出数据并生成指定格式xml文件
  10. Python heapq模块