Barrier

Barrier是类似于信号量和条件变量的概念,用于控制并行程序的执行。一个Barrier通常用来确保某些并行算法中的所有合作线程可以继续运行之前到达算法中的一个特定点。Barrier可以借助条件变量实现。

Barrier能够保证一组线程在全部到达这个barrier之前,组内任何一个线程都不能逾越barrier去继续执行下面的代码。

在Barrier最简单语义实现中,通常调用函数barrier_enter()实现一个barrier。任何调用barrier_enter()的线程都将被阻塞,直到有指定数量的线程调用此函数才会被唤醒。指定的数量由barrier_init()函数在初始化时设置,每当有线程调用enter函数时,通过atomic_inc(&X->count)进行计数。

UPCUnified ParallelC)中,barrier的实现的分开的(split-phasebarrier)。它将barrier的实现分成两个步骤:notifywait。规则是调用barrier_notify()函数并不阻塞线程。而推迟到调用barrier_wait()函数时才阻塞。在notifywait之间可以做其他的工作。可以提高程序运行的效率。当有指定数量的线程调用barrier_notify()时,所有因调用barrier_wait()被阻塞的线程都将恢复运行。这样做可以提高程序运行的效率。 

 

split-phase barrier 的实现:

定义结构体:   typedef structbarrier_s{

               atomic_tcount;

              wait_queue_head_t wait;

              }barrier_t;

barrier_init函数:

                voidbarrier_init(barrier_t *barrier,  int count)

               {

                init_waitqueue_head(&barrier->wait);

                atomic_set(&barrier->count,count);

               }

barrier_notify()函数:

               static int barrier_notify(barrier_t*barrier)             

              

                  int retval;

                if(0 != (retval = atomic_dec_and_test(&barrier->count))){

                  wake_up(&barrier->wait);

                }

                   returnretval;

               }

barrier_wait()函数:

               static int barrier_wait(barrier_t*barrier)

              {

                wait_event(barrier->wait,atomic_read(&barrier->count)<= 0);

                 returnbarrier_once();

                }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值