这个伪代码能以最大的并行度解决哲学家进餐问题吗?这mutex
是一个初始化为 1 的二进制信号量。假设分叉的编号从 0 到 (N-1)。从 0 到 (N-1) 共有 N 个哲学家。
void philosopher(int i) // ith philosopher
{
while (true)
{
think();
down(&mutex); // acquire lock
take_fork(i); // take left fork
take_fork((i+1)%N); // take right fork
up(&mutex); // release the lock
eat();
down(&mutex); // acquire lock
put_fork(i);
put_fork((i+1)%N);
up(&mutex); // release the lock
}
}
这应该以最大的并行性解决哲学家进餐问题,因为在一位哲学家获得两个分叉后,锁就会被释放。但会吗?会不会有活力的问题?我很困惑。