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
相关文章
相关标签/搜索