CCF-CSP題解 201903-4 消息傳遞接口


求並行的各個進程,且進程內部順序執行的情況下,會不會出現“死鎖”。

首先用\(%[^\n]\)將每個進程讀入。最后過不了居然是因為\(str[\ ]\)開小了(悲喜交加。存儲在\(<op,\ pid>[\ ]\)中,並記錄每個進程的指令數\(instNum[\ ]\)

然后就是模擬。\(instCmp[\ ]\)記錄每個進程已完成的指令數,\(instBlk[\ ]\)記錄每個進程是否阻塞,\(numCmp,\ numBlk\)分別是完成和阻塞的進程數。主要思想是:每次執行到某條指令阻塞,然后執行下條指令並循環。判斷是否阻塞,就是看\(<op, pid>\)對應的\(pid\)進程當前已完成的指令是否有下一條指令,以及下一條指令是否與之配對。

#include <bits/stdc++.h>
const int maxn = 10000;

using namespace std;

struct tInst
{
    int op;
    int pid;
};
tInst inst[maxn+10][10];
int instNum[maxn+10];

int instCmp[maxn+10];
int instBlk[maxn+10];
int numCmp, numBlk;

int main ()
{
    int T, n;
    scanf("%d%d", &T, &n);
    getchar();

    while (T--)
    {
        memset(instNum, 0, sizeof(instNum));
        for (int i = 0; i <= n - 1; i++)
        {
            char str[100];
            scanf("%[^\n]", str + 1);
            getchar();
            for (int j = 1, op = 0, pid = 0; ; j++)
            {
                if (str[j] == 'R')
                    op = 0;
                else if (str[j] == 'S')
                    op = 1;
                else if (str[j] >= '0' && str[j] <= '9')
                    pid = pid * 10 + str[j] - '0';
                else if (str[j] == ' ')
                {
                    inst[i][++instNum[i]].op = op;
                    inst[i][instNum[i]].pid = pid;
                    pid = 0;
                }
                else
                {
                    inst[i][++instNum[i]].op = op;
                    inst[i][instNum[i]].pid = pid;
                    break;
                }
            }
        }

        memset(instCmp, 0, sizeof(instCmp));
        memset(instBlk, 0, sizeof(instBlk));
        numCmp = numBlk = 0;

        int x = 0;
        while (numCmp + numBlk != n)
        {
            while (instCmp[x] != instNum[x] && !instBlk[x])
            {
                int y = instCmp[x] + 1;
                int op = inst[x][y].op, pid = inst[x][y].pid;
                int xx = pid;
                if (instCmp[xx] != instNum[xx])
                {
                    int yy = instCmp[xx] + 1;
                    if (op + inst[xx][yy].op == 1 && x == inst[xx][yy].pid)
                    {
                        instCmp[x] ++; instCmp[xx] ++;
                        if (instCmp[x] == instNum[x])
                            numCmp ++;
                        if (instCmp[xx] == instNum[xx])
                            numCmp ++;
                        if (instBlk[xx])
                        {
                            instBlk[xx] = 0;
                            numBlk --;
                        }
                    }
                    else
                    {
                        instBlk[x] = 1;
                        numBlk ++;
                    }
                }
                else
                {
                    instBlk[x] = 1;
                    numBlk ++;
                }
            }
            x = (x + 1) % n;
        }

        if (numCmp == n)
            printf("0\n");
        else
            printf("1\n");

    }

    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM