我对二叉树中的Peterson算法有疑问。

我正在做“多处理器编程的艺术”这本书的一些练习,我陷入了第2章,第13章:

“推广双线程彼得森锁的另一种方法是安排
二进制树中有许多2线程Peterson锁。假设n是2的幂。每个线程都分配有一个叶子锁,它与另一个线程共享。每个锁
将一个线程视为线程0,将另一个线程视为线程1。”

可以,但是呢?如果Peterson只处理2个线程,那么这棵树将如何?一棵树只有一片叶子? (因为如果我有2个线程,并且每个叶子都处理2个线程...结果将是一棵只有一个叶子的树?)

“在树锁的获取方法中,线程获取每两个线程
Peterson从该线程的叶子锁定到根。树锁的释放方法用于
树锁可解锁该线程获得的每个2线程Peterson锁,
从根到叶。”

他是什么意思?叶子如何穿过根节点?很混乱!! :S

感谢你们!

最佳答案

使用n个两线程Peterson锁并将它们排列在二叉树中的一般性工作如下:

要获取锁:


假设有n个线程要访问关键区域。
第一步使用n / 2个双线程Peterson锁。然后,为每个两个线程的Peterson锁分配两个线程。在此步骤结束时,只有n / 2个线程获得了锁。那些n / 2两线程Peterson锁是二叉树的叶子
与第一步类似,第二步使用n / 4个双线程Peterson锁,并且为每个Peterson锁分配两个线程(这些线程是第一步中的“赢家”)。那些n / 4 Peterson锁是树的新节点
此过程一直进行到到达根为止,在此只需一个彼得森锁。获取最后一个Peterson锁的线程可以进入关键区域。


释放锁

获得该锁的线程必须在其从相应叶到根的路径中释放每个Peterson锁。

希望这种解释对您有用。

09-26 17:40