某进程中有3个并发执行的线程thread1、threa

某进程中有3个并发执行的线程thread1、thread2和thread3,其伪代码如下所示。

//复数的结构类型定义
typedef struct
{
    float a;
    float b;
} cnum;
cnum x, y, z; //全局变量
 
//计算两个复数之和
cnum add(cnum p, cnum q)
{
    cnum s;
    s.a = p.a+q.a;
    s.b = p.b+q.b;
    return s;
}


thread1
{
    cnum w;
    w = add(x, y);
    …
}
 
thread2
{
    cnum w;
    w = add(y, z),
    …
}


thread3
{
    cnum w;
    w.a = 1;
    w.b = 1;
    z = add(z, w);
    y = add(y, w);
    …
}


请添加必要的信号量和P、V(或wait( )、signal( ))操作,要求确保线程互斥访问临界资源,并且最大程度地并发执行。


答:

先找出线程对在各个变量上的互斥、并发关系。如果是一读一写或两个都是写,那么这就是互斥关系。每一个互斥关系都需要一个信号量进行调节。

semaphore mutex_y1=1;//mutex_y1用于thread1与thread3对变量y的互斥访问。(1分)

semaphore mutex_y2=1;//mutex_y2用于thread2与thread3对变量y的互斥访问。(1分)

semaphore mutex_z=1; //mutex_z用于变量z的互斥访问。(1分)

互斥代码如下:(5分)

thread1

{

    cnum w; wait(mutex_y1);

    w=add(x,y); signal(mutex_y1);

    ……

}

thread2

{

    cnum w: wait(mutex_y2): wait(mutex_z);

    w=add(y,z); signal(mutex_z); signal(mutex_y2);

    ……

}

thread3

{

    cnum w;

    w.a=1;

    w.b=1;

    wait(mutex_z); z=add(z,w); signal(mutex_z); wait(mutex_y1); wait(mutex_y2);

    y=add(y,w); signal(mutex_y1); signal(mutex_y2);

    ……

}


答案
暂无答案

题目信息

题号:7244
题型:简答题
难度:普通