这篇文章给大家介绍如何分析基于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_required if (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 POSIX spec for barriers doesn't mention that pthread_barrier_wait is 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的线程屏障就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4217331/blog/4379533