various

四区域传递问题

有3个进程:get, copy和put,它们对4个存储区域f、s、t和g进行操作: 其中:f有取之不尽的数据可以get;g有用之不完的空间可以put,s和t则只有一个存储空间。

semaphore fullS=0, emptyS=1;
semaphore fullT=0, emptyT=1;

void get()
{
    while(true)
    {
        P(emptyS);
        from f to s;
        V(fullS);
    }
}

void copy()
{
    while(true)
    {
        // 答案上是两个条件都满足的时候,一下子从s就到t了
        // P(fullS);
        // get one from s;
        // V(emptyS);

        // P(emptyT);
        // put it into t;
        // V(fullT);

        P(fullS);
        P(emptyT);
        from s to t;
        V(fullT);
        V(emptyS);
    }
}

void put()
{
    P(fullT);
    from t to g;
    V(emptyT);
}

void main()
{
    cobegin;
        get();
        copy();
        put();
    coend;
}