文章
397
粉丝
40
获赞
2
访问
90.3k
semaphore mutex = 1;
//复数的结构类型定义
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;
wait(mutex);
w=add(x,y);
p(mutex);
...
}
thread2
{
cnum w;
wait(mutex);
w=add(x,y);
p(mutex);
...
}
thread3
{
cnum w;
w.a=1;
w.b=2;
wait(mutex);
z=add(z,w);
p(mutex);
wait(mutex);
y=add(y,w);
p(mutex);
...
}
评分及理由
(1)信号量定义(满分3分)
学生只定义了一个信号量mutex,但标准答案需要三个信号量(mutex_y1、mutex_y2、mutex_z)来分别保护不同的临界资源(y和z),以实现最大程度的并发。学生答案无法实现并发,且对资源保护不精确。扣3分。
得分:0分
(2)thread1代码(满分1分)
学生使用wait(mutex)和p(mutex)(p应为signal)保护add(x,y),但标准答案要求只保护y(使用mutex_y1),而x是只读的无需保护。学生错误地保护了整个add操作,且信号量使用错误(p(mutex)应为signal(mutex)),但基本有互斥意识。扣0.5分(信号量操作错误)和0.5分(过度保护导致并发性降低)。
得分:0分
(3)thread2代码(满分1分)
学生代码中w=add(x,y)应为add(y,z)(题目要求),这是一个逻辑错误(误用x而不是z)。同时,信号量保护错误(同thread...
登录后发布评论
暂无评论,来抢沙发