有n个进程互相通信,每个进程只会两种操作发送信息和接受信息,每个进程会有一个任务队列,队列中的任务必须挨个执行,让你判断是否会死锁 首先每个队列建立一个任务队列,队列使用deque 建立两个map当有暂时不能匹配的接受信息和发送信息时存入map 维护一个任务栈首先初始化将n个任务压入,然后在循环中依次取出直到栈空结束循环,每当匹配成功时将匹配成功的两个进程压入栈(这种方法可以处理超出题目限制的8条以上的任务) 结果判断,当rec和send全部为空时无死锁 看完觉得还可以记得点个赞啊题意
思路
每次取出一个任务vector<deque<pair<char, int>>> processes;//全部进程的任务队列
unordered_map<int, int> rec, send;//键为自身进程,值为目标进程
deque<int> taskque; for (int i = 0; i < n; ++i)taskque.push_back(i);//初始化,把0到n-1条进程压入栈
代码
#include <iostream> #include <string> #include <sstream> #include <fstream> #include <vector> #include <deque> #include <unordered_map> using namespace std; int t, n; vector<deque<pair<char, int>>> processes;//全部进程的任务队列 void execute() { unordered_map<int, int> rec, send;//键为自身进程,值为目标进程 deque<int> taskque; for (int i = 0; i < n; ++i)taskque.push_back(i);//初始化,把0到n-1条进程压入栈 while (!taskque.empty()) { int cur = taskque.front(); taskque.pop_front(); if (processes[cur].empty())continue;//进程内无任务跳过 int num = processes[cur].front().second; if (processes[cur].front().first == 'S') { auto rp = rec.find(num); if (!rec.empty() && rp != rec.end() && rp->second == cur) {//如果目标进程正等待本进程的发送数据 processes[num].pop_front(); processes[cur].pop_front();//将自身进程和目标进程弹出一个任务 taskque.push_front(num); taskque.push_front(cur);//将自身进程和目标进程压入栈 rec.erase(num); } else send.insert({ cur,num }); } else { auto sp = send.find(num); if (!send.empty() && sp != send.end() && sp->second == cur) { processes[num].pop_front(); processes[cur].pop_front(); taskque.push_front(num); taskque.push_front(cur); send.erase(num); } else rec.insert({ cur,num }); } } if (rec.empty() && send.empty())cout << '0' << endl; else cout << '1' << endl; } //#define DEBUG int main() { #ifdef DEBUG fstream cin("input.txt"); #endif // DEBUG ios::sync_with_stdio(false); cin.tie(NULL); cin >> t >> n; cin.get(); for (; t != 0; --t) { processes.resize(n); for (int i = 0; i < n; ++i) { stringstream strs; string temp; getline(cin, temp); strs << temp; int num; char c; while (strs >> c >> num) processes[i].push_back({ c,num }); } execute(); processes.clear(); } }
测试数据
//官方数据 2 3 R1 S1 R2 S0 R0 S2 S1 R1 R1 R2 S0 R0 S1 R1 //自己设的数据 1 5 S1 S1 S1 S1 R4 R4 R4 R4 R0 R0 R0 R0 S2 S2 S2 S2 R1 R1 R1 R1 S3 S3 S3 S3 R2 R2 R2 R2 S4 S4 S4 S4 R3 R3 R3 R3 S0 S0 S0 S0 //结果为0
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算