我正在阅读这篇论文中关于屏障同步算法的伪代码,但我无法完全理解它。
代码的目标是使用称为“软件组合树”的东西为多个线程创建一个屏障(除非所有线程都完成,否则线程不能通过屏障)(不确定它的含义)
这是伪代码(尽管我鼓励你也看看这篇文章)
type node = record
k : integer // fan-in of this node
count : integer // initialized to k
locksense : Boolean // initially false
parent : ^node // pointer to parent node; nil if root
shared nodes : array [0..P-1] of node
// each element of nodes allocated in a different memory module or cache line
processor private sense : Boolean := true
processor private mynode : ^node // my group's leaf in the combining tree
procedure combining_barrier
combining_barrier_aux (mynode) // join the barrier
sense := not sense // for next barrier
procedure combining_barrier_aux (nodepointer : ^node)
with nodepointer^ do
if fetch_and_decrement (&count) = 1 // last one to reach this node
if parent != nil
combining_barrier_aux (parent)
count := k // prepare for next barrier
locksense := not locksense // release waiting processors
repeat until locksense = sense
我知道这意味着构建二叉树,但我不明白一些事情。
- P是线程数吗?
- 什么是k?什么是“该节点的扇入”
- 文章提到线程在树的叶子上被组织成组,什么组?
- 每个线程是否只有一个节点?
- 如何获得“组合树中我组的叶子”?