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
上一篇下一篇

猜你喜欢

热点阅读