MIT6.828 HW9: barriers
阿新 • • 發佈:2019-01-08
在這次作業中我們將探索如何使用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,然後廣播通知所有執行緒,喚醒等待中的執行緒。