屏障(barrier)是用户协调多个线程并行工作的同步机制。屏障允许每个线程等待,直到所有的合作线程都到达某一点,然后从该点继续执行。
屏障允许任意数量的线程等待,知道所有的线程完成处理工作,而线程不需要退出。所有线程到达屏障之后可以接着工作。
可以使用pthread_barrier_init函数对屏障进行初始化,用pthread_barrier_destroy函数进行反初始化。
#include <pthread.h> int pthread_barrier_init(pthread_barrier_t *restrict barrier, const pthread_barrierattr_t *restrict attr, unsigned int count); int pthread_barrier_destroy(pthread_barrier_t *barrier); 两个函数的返回值:若成功,返回0;否则,返回错误编号 |
---|
初始化屏障时,可以使用count参数指定,在允许所有线程继续运行之前,必须到达屏障线程数目。使用attr参数指定屏障对象的属性,置空时为默认属性。
可以使用pthread_barrier_wait函数来表明线程已完成工作,准备等所有的其他线程赶上来。
#include <pthread.h> int pthread_barrier_wait(pthread_barrier_t *barrier); 返回值:若成功,返回0或者PTHREAD_BARRIER_SERIAL_THREAD;否则,返回错误编号 |
---|
调用pthread_barrier_wait的线程在屏障计数未满足条件时,会进入休眠状态。如果该线程时最后一个调用pthread_barrier_wait的线程,就满足了屏障计数,所有的线程都会被唤醒。
一旦达到屏障计数值,而且线程处于非阻塞状态,屏障就可以被重用。但是除非在调用了pthread_barrier_destroy函数之后,又调用了pthread_barrier_init函数对计数调用另外的函数进行初始化,否则屏障计数不会改变。