现在我实施了我的障碍。 但它效果不好。
当我运行屏障时间计算代码 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(在我的平台中)
答案 0 :(得分:2)
glibc的屏障是使用较低级别的原语实现的,而不是互斥和条件。
你的基于互斥体的实现有一个明显的问题,就是它需要每个被唤醒的线程重新获取互斥锁才能释放它。这违背了障碍的精神:本身就是一流的原语。 (当然,这是一个快速而肮脏的代码端口的好方法,它需要屏障只能提供互斥和条件的平台。)
顺便提一下,我写了大约十二年前在glibc中存在的第一个POSIX屏障函数。 表情!