文章
281
粉丝
40
获赞
2
访问
23.8k
#define MAXSIZE 1000
semaphore mutex = 1;//对环形缓冲区互斥访问
semaphore mutex_batch = 1;//某一进程取走10个数据后,别的进程才能取数据
semaphore empty = MAXSIZE;//还能放入多少个产品
semaphore full = 0;//已经放入了多少个产品
ElemType buffer[MAXSIZE];
int rear = 0;//队尾
int front = 0;//队头
CoBegin{
product_i(){
while(true){
p(empty);
p(mutex);
放入buffer[rear]中一个产品;
v(mutex);
v(full);
rear = (rear+1)% MAXSIZE;
}
}
consumer_i(){
while(true){
p(mutex_batch);
for(int i = 1; i <= 10; i++){
p(full);
p(mutex);
从buffer[rear]中取走一个产品;
v(mutex);
v(empty);
front = (front+1) % MAXSIZE;
}
v(mutex_batch);
}
}
}CoEnd
评分及理由
(1)信号量定义得分及理由(满分2分)
得分:2分
理由:学生定义了四个信号量,含义和初值都正确。mutex用于缓冲区互斥访问(初值1),mutex_batch用于控制消费者连续取10件产品(初值1),empty表示空位数量(初值1000),full表示产品数量(初值0),与标准答案一致。
(2)生产者进程实现得分及理由(满分3分)
得分:2分
理由:生产者进程的同步(P(empty)、V(full))和互斥(P(mutex)、V(mutex))操作正确。但存在一个逻辑错误:在生产者进程中,对rear指针的修改(rear = (rear+1)% MAXSIZE)应该放在互斥锁mutex的保护范围内,因为rear是共享变量,否则可能导致数据不一致。此处扣1分。
(3)消费者进程实现得分及理由(满分3分)
得分:1分
理由:消费者进程使用了mutex_b...
登录后发布评论
暂无评论,来抢沙发