我怎样才能实现快速屏障?

时间:2012-04-10 02:02:28

标签: linux pthreads

现在我实施了我的障碍。 但它效果不好。

当我运行屏障时间计算代码   pthread_barrier_wait消耗180000 us   我的障碍消耗390000我们

我不知道为什么,我想制造更快的障碍

这是我的障碍代码

 82 pthread_mutex_t     mutexwait1;
 83 int wait_count = NUM_THREADS;
 84 int barrier1234(void) {                                                     
 85 
 86     int status, cancel, tmp;
 87     status = pthread_mutex_lock(&mutexwait1);
 88     wait_count = wait_count - 1;
 89     if(wait_count == 0){ 
 90         pthread_cond_broadcast(&cond1);
 91         wait_count = NUM_THREADS ;  
 92     }   
 93     else
 94         status = pthread_cond_wait(&cond1, &mutexwait1);
 95 
 96     pthread_mutex_unlock(&mutexwait1);
 97     return status;
 98 
 99 }

我找到了一些barrier_wait函数,但它没有用。 (从glibc下载)   =>编译屏障时会出现错误消息(结构变量不匹配)   =>我想知道这个错误是由版本

引起的

我正在使用ubuntu 10.04   请教我为什么我的障碍很慢。   我如何实现默认的pthread_barrier_wait(在我的平台中)

1 个答案:

答案 0 :(得分:2)

glibc的屏障是使用较低级别的原语实现的,而不是互斥和条件。

你的基于互斥体的实现有一个明显的问题,就是它需要每个被唤醒的线程重新获取互斥锁才能释放它。这违背了障碍的精神:本身就是一流的原语。 (当然,这是一个快速而肮脏的代码端口的好方法,它需要屏障只能提供互斥和条件的平台。)

顺便提一下,我写了大约十二年前在glibc中存在的第一个POSIX屏障函数。 表情!