Linux 同步机制:屏障

版权声明:转载请声明 https://blog.csdn.net/qq_40732350/article/details/82723014

屏障(barrier)是用户协调多个线程并行工作的同步机制。屏障允许每个线程等待,直到所有的合作线程都到达某一点,然后从该点继续执行。

它们允许任意数量的线程等待,直到所有的线程完成处理工作, 而线程不需要退出。所有线程达到屏障后可以接着工作。

作用:

  1. 使用于大量的运算,而个线程间没有干扰
  2. 用一些需要等待所有线程完成后,所有线程才能继续进行的应用

可以使用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写完了

猜你喜欢

转载自blog.csdn.net/qq_40732350/article/details/82723014