某进程中有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); …… } |
答案
暂无答案