MIT6.828 Fall2018 笔记 - Homework 9: Barriers

Barriers

目的是让所有线程都在barrier()等待,直到所有线程都执行到了barrier(),才会进行一次bstate.round++;

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
posted @ 2020-05-09 11:23  hyuuko  阅读(178)  评论(0编辑  收藏  举报