版权声明:转载请声明 https://blog.csdn.net/qq_40732350/article/details/82723014
屏障(barrier)是用户协调多个线程并行工作的同步机制。屏障允许每个线程等待,直到所有的合作线程都到达某一点,然后从该点继续执行。
它们允许任意数量的线程等待,直到所有的线程完成处理工作, 而线程不需要退出。所有线程达到屏障后可以接着工作。
作用:
- 使用于大量的运算,而个线程间没有干扰
- 用一些需要等待所有线程完成后,所有线程才能继续进行的应用
可以使用pthreadbarrier_init函数对屏障进行初始化,用threadbarrier_destroy函数反初始化。
初始化屏障时,可以使用count参数指定,在允许所有线程继续运行之前,必须到达屏障的线程数目。使用atr参数指定屏障对象的属性,我们会在下一章详细讨论。现在设置attr为NULL, 1用默认属性初始化屏障。如果使用pthread-barrier-init函数为屏障分配资源,那么在反初始化屏障时可以调用pthreadbarrier_destroy函数释放相应的资源。
基本函数:
int pthread_barrier_destroy(pthread_barrier_t *barrier); //销毁屏障
int pthread_barrier_init(pthread_barrier_t *restrict barrier, //count指定所有线程继续运行之前,必须到达屏障的线程数量
const pthread_barrierattr_t *restrict attr, unsigned count);
int pthread_barrier_wait(pthread_barrier_t *barrier); //等待所有线序达到
实例代码:
#include <pthread.h>
#include <stdio.h>
#include <string.h>
char buff[100];
int buff_len;
pthread_barrier_t barrier;
pthread_mutex_t mutex;
void* th_writer(void *p)
{
printf("\n线程3正在写\n");
pthread_barrier_wait( &barrier ); //等待
printf("\n线程3写完了\n");
pthread_exit( (void *)0 );
}
void* th_reader1(void *p)
{
printf("\n线程1正在写\n");
pthread_barrier_wait( &barrier ); //等待
printf("\n线程1写完了\n");
pthread_exit( (void *)0 );
}
void* th_reader2(void *p)
{
printf("\n线程2正在写\n");
pthread_barrier_wait( &barrier ); //等待
printf("\n线程2写完了\n");
pthread_exit( (void *)0 );
}
int main()
{
pthread_t tid1, tid2, tid3;
void *ret1, *ret2, *ret3;
pthread_barrier_init( &barrier, NULL, 3 ); //屏障初始化
pthread_mutex_init( &mutex, NULL ); //互斥锁初始化
printf("start thread1\n");
pthread_create(&tid1, NULL, th_reader1, NULL); //创建 读 线程1
printf("wait 1s in main thread.\n");
printf("start thread2\n");
pthread_create(&tid2, NULL, th_reader2, NULL); //创建 读 线程2
printf("start thread3\n");
pthread_create(&tid3, NULL, th_writer, NULL); //创建 读 线程3
pthread_join(tid1, &ret1);
pthread_join(tid2, &ret2);
pthread_join(tid3, &ret3);
pthread_barrier_destroy(&barrier); //销毁屏障
pthread_mutex_destroy( &mutex ); //消除互斥锁
return 0;
}
结果:
# ./a.out
start thread1
wait 1s in main thread.
start thread2
start thread3线程1正在写
线程2正在写
线程3正在写
线程3写完了
线程1写完了
线程2写完了