Barrier(moderate)
屏障(Barrier):应用程序中的一个点,所有参与的线程在此点上必须等待,直到所有其他参与线程也达到该点
用于需要多个线程在某个阶段完成某项工作后再一起进行下一步操作的场景
问题抛出
文件notxv6/barrier.c包含一个残缺的屏障实现
bash
eason@eason-VMware-Virtual-Platform:~/work/xv6-labs-2020$ make barrier
gcc -o barrier -g -O2 notxv6/barrier.c -pthread
eason@eason-VMware-Virtual-Platform:~/work/xv6-labs-2020$ ./barrier 2
barrier: notxv6/barrier.c:45: thread: Assertion `i == t' failed.
barrier: notxv6/barrier.c:45: thread: Assertion `i == t' failed.
Aborted (core dumped)
实现barrier()函数
diff --git a/notxv6/barrier.c b/notxv6/barrier.c
index 12793e8..2bd85dc 100644
--- a/notxv6/barrier.c
+++ b/notxv6/barrier.c
@@ -30,7 +30,17 @@ barrier()
// Block until all threads have called barrier() and
// then increment bstate.round.
//
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);
}
static void *
测试
重新编译
使用一个、两个和两个以上的线程测试代码
bash
eason@eason-VMware-Virtual-Platform:~/work/xv6-labs-2020$ make barrier
gcc -o barrier -g -O2 notxv6/barrier.c -pthread
eason@eason-VMware-Virtual-Platform:~/work/xv6-labs-2020$ ./barrier 1
OK; passed
eason@eason-VMware-Virtual-Platform:~/work/xv6-labs-2020$ ./barrier 2
OK; passed
eason@eason-VMware-Virtual-Platform:~/work/xv6-labs-2020$ ./barrier 4
OK; passed