linux barrier 栅栏屏障,让多任务在栅栏处集合,全部到齐后同时出发

概述
pthread_barrier_t 这是posix定义线程同步方法,不一定所有linux 版本中都实现了它。

barrier 是一种非常有效的线程同步方法,当我们需要几个线程一起开始时,或者在某个条件下需要一起等待时,
就需要有个类似栅栏一样的东西,条件成立时,就会被拦住。

当然这个功能,也可能通过管道,信号量,eventfd等方法实现,但是barrier非常简单高效。

接口
/* 头文件 */
#include <pthread.h>

/* 初始化接口 */
int pthread_barrier_init(pthread_barrier_t *restrict barrier,
const pthread_barrierattr_t *restrict attr, unsigned count);

/* 销毁接口,资源回收 */
int pthread_barrier_destroy(pthread_barrier_t *barrier);

/* 栅栏接口,调用者会阻塞,直到调用次数达到 count值后,所有阻塞都会放开 */
int pthread_barrier_wait(pthread_barrier_t *barrier);

接口说明
1.pthread_barrier_init接口会初始化所需资源;
如果attr传入为NULL时,采用默认值进行初始化;

count ,是指调用 pthread_barrier_wait多少次,才能成功返回;其值必须大于0 ;

只有返回成功,才是初始化完成;

返回码
EAGAIN 系统资源不足

EINVAL 非法入参,count必须大于0

ENOMEM 内存不足
2.pthread_barrier_destroy 接口销毁所有barrier上分配的资源
3.pthread_barrier_wait 会设置屏障栅栏,所有调用处都会被阻塞住,直到调用次数到达count值时,才会继续执行;
对于超过count的调用,不会被阻栏,那么它们有可能会先于栅栏阻塞的线程执行;这是由系统调度来决定的;

当调用达到count次数后,又会被重置;

posted @ 2023-09-01 09:53  HelloMarsMan  阅读(108)  评论(0)    收藏  举报