这篇文章给大家介绍如何分析基于linux threads-2.3的线程屏障,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

专注于为中小企业提供成都网站制作、成都网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业伊犁免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
线程屏障是线程同步的一个方式。线程执行完一个操作后,可能需要等待其他线程也完成某个动作,这时候,当前该线程就会被挂起,直到其他线程也完成了某个操作,最后所有线程被唤醒。屏障主要有三个函数。
intpthread_barrier_wait(pthread_barrier_t *barrier){pthread_descr self = thread_self();pthread_descr temp_wake_queue, th;int result = 0;__pthread_lock(&barrier->__ba_lock, self);/* If the required number of threads have achieved rendezvous... */// pthread_barrier_wait被调用的次数达到阈值,__ba_present + 1 == __ba_requiredif (barrier->__ba_present >= barrier->__ba_required - 1){/* ... then this last caller shall be the serial thread */result = PTHREAD_BARRIER_SERIAL_THREAD;/* Copy and clear wait queue and reset barrier. */// 被阻塞的线程队列temp_wake_queue = barrier->__ba_waiting;// 重置字段barrier->__ba_waiting = NULL;barrier->__ba_present = 0;}else{result = 0;// 执行pthread_barrier_wait一次,加一barrier->__ba_present++;// 插入等待队列enqueue(&barrier->__ba_waiting, self);}__pthread_unlock(&barrier->__ba_lock);// 调用pthread_barrier_wait的次数还不够if (result == 0){/* Non-serial threads have to suspend */// 挂起当前线程suspend(self);/* We don't bother dealing with cancellation because the POSIXspec for barriers doesn't mention that pthread_barrier_waitis a cancellation point. */}else{/* Serial thread wakes up all others. */// 唤醒其他的线程while ((th = dequeue(&temp_wake_queue)) != NULL)restart(th);}return result;}intpthread_barrier_init(pthread_barrier_t *barrier,const pthread_barrierattr_t *attr,unsigned int count){if (count == 0)return EINVAL;__pthread_init_lock(&barrier->__ba_lock);// 需要执行pthread_barrier_wait的次数barrier->__ba_required = count;// 已经调用pthread_barrier_wait的次数barrier->__ba_present = 0;// 调用pthread_barrier_wait被阻塞的线程队列barrier->__ba_waiting = NULL;return 0;}intpthread_barrier_destroy(pthread_barrier_t *barrier){// 有线程在等待if (barrier->__ba_waiting != NULL) return EBUSY;return 0;}
从代码里我们知道,屏障的本质就是计数,还没有达到某个数的时候,当前线程就被阻塞,等到最后一个线程执行pthread_barrier_wait函数并且得到了某个数的时候,全部线程被唤醒。
关于如何分析基于linux threads-2.3的线程屏障就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。