互斥锁屏障
barrier 的数据类型是 pthread_barrier_t.
- 初始化和回收
int pthread_barrier_init(pthread *barrier,
const pthread_barrier_t *attr, unsigned int count);
int pthread_barrier_destroy(pthread_barrier_t *barrier);
- 等待函数
int pthread_barrier_wait(pthread_barrier_t *barrier);
每一个线程调用等待函数,barrier 计数都会加 1,直到计数值等于初始化函数中的参数 count。当最后一个线程让 barrier 计数值达到了 count,所有等待的线程都会被唤醒。
/*************************************************************************
> File Name: pthread_barrier_屏障.cpp
> Author: Function_Dou
> Mail:
> Created Time: 2018年02月08日 星期四 15时07分25秒
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>
static pthread_barrier_t barrier;
static pthread_mutex_t mutex;
void *thread1(void *)
{
pthread_mutex_lock(&mutex);
printf("thread\n");
pthread_mutex_unlock(&mutex);
// 线程到达后阻塞
pthread_barrier_wait(&barrier);
printf("barrier\n");
}
const int num = 100;
int main(int argc, char *argv[])
{
pthread_t n[num];
// 设置屏障数
pthread_barrier_init(&barrier, NULL, 101);
int i = 0;
for(; i < num; i++)
pthread_create(&n[i], NULL, thread1, NULL);
pthread_barrier_wait(&barrier);
// 所有线程达到barriet后才开始运行
printf("main barrier\n");
pthread_barrier_destroy(&barrier);
for(i = 0; i <num; i++)
pthread_join(n[i], NULL);
exit(EXIT_SUCCESS);
}


本文介绍了在Linux Unix环境下,如何使用互斥锁屏障(pthread_barrier_t)进行多线程同步。内容包括互斥锁屏障的初始化、回收以及等待函数的使用,当所有线程都到达屏障点时,计数达到预设值,所有线程会被唤醒继续执行。
670

被折叠的 条评论
为什么被折叠?



