linux c屏障示例
2021-08-19 本文已影响0人
一路向后
1.程序目标
主线程等待其他线程都完成工作后自己再向下执行,类似pthread_join()函数!
2.源码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
/*屏障总数*/
#define PTHREAD_BARRIER_SIZE 4
/*定义屏障*/
pthread_barrier_t barrier;
void err_exit(const char *errmsg)
{
printf("error: %s\n", errmsg);
exit(0);
}
void *pthread_fun(void *arg)
{
char *thr_name = (char *)arg;
int result;
sleep(2);
printf("线程%s工作完成...\n", thr_name);
/*等待屏障*/
result = pthread_barrier_wait(&barrier);
if(result == PTHREAD_BARRIER_SERIAL_THREAD)
{
printf("线程%s, wait后第一个返回\n", thr_name);
}
else if(result == 0)
{
printf("线程%s, wait后返回0\n", thr_name);
}
return NULL;
}
int main()
{
pthread_t tid[3];
/*初始化屏障*/
pthread_barrier_init(&barrier, NULL, PTHREAD_BARRIER_SIZE);
if(pthread_create(tid+0, NULL, pthread_fun, "1") != 0)
{
err_exit("create thread 1");
}
else if(pthread_create(tid+1, NULL, pthread_fun, "2") != 0)
{
err_exit("create thread 2");
}
else if(pthread_create(tid+2, NULL, pthread_fun, "3") != 0)
{
err_exit("create thread 3");
}
/*主线程等待工作完成*/
pthread_barrier_wait(&barrier);
printf("所有线程工作已完成...\n");
sleep(1);
return 0;
}
3.编译源码
$ gcc -o example example.c -lpthread
4.运行及其结果
线程3工作完成...
线程2工作完成...
线程1工作完成...
线程1, wait后第一个返回
所有线程工作已完成...
线程2, wait后返回0
线程3, wait后返回0