Barrier是类似于信号量和条件变量的概念,用于控制并行程序的执行。一个Barrier通常用来确保某些并行算法中的所有合作线程可以继续运行之前到达算法中的一个特定点。Barrier可以借助条件变量实现。
Barrier能够保证一组线程在全部到达这个barrier之前,组内任何一个线程都不能逾越barrier去继续执行下面的代码。
在Barrier最简单语义实现中,通常调用函数barrier_enter()实现一个barrier。任何调用barrier_enter()的线程都将被阻塞,直到有”指定”数量的线程调用此函数才会被唤醒。”指定”的数量由barrier_init()函数在初始化时设置,每当有线程调用enter函数时,通过atomic_inc(&X->count)进行计数。
在UPC(Unified ParallelC)中,barrier的实现的分开的(split-phasebarrier)。它将barrier的实现分成两个步骤:notify和wait。规则是调用barrier_notify()函数并不阻塞线程。而推迟到调用barrier_wait()函数时才阻塞。在notify和wait之间可以做其他的工作。可以提高程序运行的效率。当有指定数量的线程调用barrier_notify()时,所有因调用barrier_wait()被阻塞的线程都将恢复运行。这样做可以提高程序运行的效率。
split-phase barrier 的实现:
定义结构体:
barrier_init函数:
barrier_notify()函数:
barrier_wait()函数: