美文网首页
thread barrier

thread barrier

作者: _宋江_ | 来源:发表于2023-03-07 21:26 被阅读0次

    之前也介绍过线程之间的同步和互斥,接下来看一下barrier。假设我们要执行一个包含两个阶段的多线程计算,但是我们不希望在完成第一阶段之前进入第二阶段。我们可以使用一种称为屏障(barrier)的同步方法。当线程到达barrier时,它将在barrier处等待,直到所有线程到达barrier,然后它们将一起进行。

    如何理解barrier呢?就像和一些朋友一起远足。大家会会记下有多少个朋友,并同意在每个山峰的顶部等彼此。假设你是第一个到达第一个山顶的人,你将在顶部等其他朋友。他们会一一到达顶部,但是直到最后一个人到达之前,没有人会继续走。等所有人都到了之后,大家将继续进行。

    Pthreads具有实现该功能的函数pthread_barrier_wait()。需要声明一个pthread_barrier_t变量,并使用pthread_barrier_init()对其进行初始化。 pthread_barrier_init()将将要参与barrier的线程数作为参数。

    下面是一个示例程序:

    #define _GNU_SOURCE
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <time.h>
    
    #define THREAD_COUNT 4
    
    pthread_barrier_t mybarrier;
    
    void* threadFn(void *id_ptr) {
      int thread_id = *(int*)id_ptr;
      int wait_sec = 1 + rand() % 5;
      printf("thread %d: Wait for %d seconds.\n", thread_id, wait_sec);
      sleep(wait_sec);
      printf("thread %d: I'm ready...\n", thread_id);
    
      pthread_barrier_wait(&mybarrier);
    
      printf("thread %d: going!\n", thread_id);
      return NULL;
    }
    
    
    int main() {
      int i;
      pthread_t ids[THREAD_COUNT];
      int short_ids[THREAD_COUNT];
    
      srand(time(NULL));
      pthread_barrier_init(&mybarrier, NULL, THREAD_COUNT + 1);
    
      for (i=0; i < THREAD_COUNT; i++) {
        short_ids[i] = i;
        pthread_create(&ids[i], NULL, threadFn, &short_ids[i]);
      }
    
      printf("main() is ready.\n");
    
      pthread_barrier_wait(&mybarrier);
    
      printf("main() is going!\n");
    
      for (i=0; i < THREAD_COUNT; i++) {
        pthread_join(ids[i], NULL);
      }
    
      pthread_barrier_destroy(&mybarrier);
    
      return 0;
    }
    

    相关文章

      网友评论

          本文标题:thread barrier

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