0

现在我实现了我的障碍。但效果不佳。

当我运行障碍时间计算代码 pthread_barrier_wait 消耗 180000 我们我的障碍消耗 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 (在我的平台上)

4

1 回答 1

2

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

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

顺便说一句,大约十二年前,我编写了第一个存在于 glibc 中的 POSIX 屏障函数。眨眼!

于 2012-04-11T01:31:10.773 回答