MIT6.828 Fall2018 筆記 - Homework 9: Barriers

Barriershtml

目的是讓全部線程都在barrier()等待,直到全部線程都執行到了barrier(),纔會進行一次bstate.round++;bash

static void barrier() {
    pthread_mutex_lock(&bstate.barrier_mutex);
    bstate.nthread++;
    // 若是當前線程是最後一個線程(此時其餘 nthread-1 個線程所有都在sleep),則執行操做
    if (bstate.nthread == nthread) { // nthread是線程總數
        bstate.round++; // 操做
        // 操做完成,重置 bstate.nthread
        bstate.nthread = 0;
        // 喚醒正在sleep的 nthread-1 個線程
        pthread_cond_broadcast(&bstate.barrier_cond); // wake
    } else {
        // 若是當前線程不是最後一個線程,則sleep
        pthread_cond_wait(&bstate.barrier_cond, &bstate.barrier_mutex);
    }
    pthread_mutex_unlock(&bstate.barrier_mutex);
}

結果:線程

❯ gcc -g -O2 -pthread barrier.c
❯ ./a.out 5
OK; passed
相關文章
相關標籤/搜索