MIT6.828 Fall2018 笔记 - Homework 9: 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
本文到这里就结束了,有疑问欢迎评论哦😉