我对二叉树中的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锁。
希望这种解释对您有用。