文章
246
粉丝
40
获赞
2
访问
12.4k
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分。
(2)线程1的互斥实现(满分1分)
学生使用wait(mutex)和p(mutex)(应为signal(mutex))来保护add(x,y)操作。虽然语法有误(p操作应为signal),但基本实现了互斥。然而,由于信号量设计错误(单一锁),无法实现并发优化。扣0.5分(因信号量设计错误导致逻辑问题,但互斥意图正确)。
(3)线程2的互斥实现(满分1分)
学生代码中w=add(x,y)明显错误(应为add(y,z)),这是一个逻辑错误,因为线程2应该计算y和z的和。同时,信号量使用错误(单一锁)且语法错误(p操作应为signal)。扣1分(逻辑错误和信号量...
登录后发布评论
暂无评论,来抢沙发