1. 程式人生 > >MIT6.828 HW9: barriers

MIT6.828 HW9: barriers

  在這次作業中我們將探索如何使用pthread庫提供的條件變數來實現1個barrier(屏障)。屏障就是程式中的某一個點必須所有執行緒都到達才能繼續執行。
  下載barrier.c,編譯並執行。

$ gcc -g -O2 -pthread barrier.c
$ ./a.out 2
Assertion failed: (i == t), function thread, file barrier.c, line 55.

  程式的main函式闖將n個執行緒,每個執行緒執行1個for迴圈,在每次迴圈時assert檢測迴圈次數是否與全域性統計值相等,然後呼叫barrier函式,最後sleep。

  for (i = 0; i < 20000; i++) {
    int t = bstate.round;
    assert (i == t);
    barrier();
    usleep(random() % 100);
  }

  我們要實現的就是在barrier函式中確保執行緒都執行完1次迴圈才開始下1次迴圈。增加的程式碼如下:

  pthread_mutex_lock(&bstate.barrier_mutex);
  bstate.nthread++;
  if (bstate.nthread == nthread) {
    bstate.round
++; bstate.nthread = 0; pthread_cond_broadcast(&bstate.barrier_cond); } else { pthread_cond_wait(&bstate.barrier_cond, &bstate.barrier_mutex); } pthread_mutex_unlock(&bstate.barrier_mutex);

  先上鎖,增加執行緒數統計變數barrier.nthread,判斷是否已經達到n,如果沒有則呼叫條件變數等待,如果達到了,那麼就增加迴圈次數統計變數barrier.round,同時將barrier.nthread置0,然後廣播通知所有執行緒,喚醒等待中的執行緒。