Concurrency 使用二进制信号量

Concurrency 使用二进制信号量,concurrency,semaphore,dining-philosopher,binary-semaphore,Concurrency,Semaphore,Dining Philosopher,Binary Semaphore,这个伪代码能以最大的并行性解决这个问题吗?这里的mutex是一个初始化为1的二进制信号量。假设叉的编号范围为0到(N-1)。总共有N个哲学家,编号从0到(N-1) 这将以最大的并行性解决哲学家进餐问题,因为在一个哲学家获得两个叉子后,锁将被释放。但会吗?会不会有生动活泼的问题?我很困惑。为了回答你的问题,我想提供一些事件的线索,这些事件似乎将你的哲学家带入了一种不受欢迎的状态 考虑一个系统,其Ph值(0),…,Ph值(N-1)为N>2,且动作顺序如下: Ph(1).think(); Ph(0).

这个伪代码能以最大的并行性解决这个问题吗?这里的
mutex
是一个初始化为1的二进制信号量。假设叉的编号范围为0到(N-1)。总共有N个哲学家,编号从0到(N-1)


这将以最大的并行性解决哲学家进餐问题,因为在一个哲学家获得两个叉子后,锁将被释放。但会吗?会不会有生动活泼的问题?我很困惑。

为了回答你的问题,我想提供一些事件的线索,这些事件似乎将你的哲学家带入了一种不受欢迎的状态

考虑一个系统,其Ph值(0),…,Ph值(N-1)为N>2,且动作顺序如下:

Ph(1).think();
Ph(0).think();
Ph(1).down(&mutex);
Ph(1).take_fork(1);
Ph(1).take_fork(2);
Ph(1).up(&mutex);
Ph(0).down(&mutex);
Ph(0).take_fork(0);
Ph(0).take_fork(1);
回想一下,
Ph(1)
已经获得了
fork(1)
。现在,根据
take\u fork()
的语义,可能会出现不同的行为

如果
take_fork()
在无法获取fork时立即失败,则
fork(0)
将永远不会被释放


如果
take_fork()
挂起直到资源被释放,那么互斥锁将永远不会被释放,并且其他哲学家都无法取得进展,因此一次只有一位哲学家在吃东西。

当哲学家获得互斥锁并发现他的右叉被占用时,会发生什么?
take_fork
是否会失败,从而留下未释放的左fork?这应该是不可能的,因为互斥锁已经被其他哲学家关闭了@德米特里丘巴罗夫
Ph(1).think();
Ph(0).think();
Ph(1).down(&mutex);
Ph(1).take_fork(1);
Ph(1).take_fork(2);
Ph(1).up(&mutex);
Ph(0).down(&mutex);
Ph(0).take_fork(0);
Ph(0).take_fork(1);