美文网首页
linux c屏障示例

linux c屏障示例

作者: 一路向后 | 来源:发表于2021-08-19 21:29 被阅读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
    

    相关文章

      网友评论

          本文标题:linux c屏障示例

          本文链接:https://www.haomeiwen.com/subject/looabltx.html