操作系统原理作业(九):Barriers

实验要求

使用环境变量(condition variables)来实现barrier,以在多线程的并行计算中达到同步的目的。其中barrier相当于一堵“墙”,先到达barrier的线程需要等待后到达barrier的线程。对于源代码中的一组线程来说,只有其它线程都到达了这堵“墙”,系统才会允许其中的线程继续运行。可以说,这堵“墙”起到了拦截的作用,以便达到让所有的线程实现同步运行的目的。

实验步骤

下载barrier.c源文件,并在Linux环境下进行编译运行,出现“Assertion failed”错误:

修改barrier.c中的barrier()函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void barrier()
{
//对临界区进行加锁,barrier_mutex是开头定义的信号量
pthread_mutex_lock(&bstate.barrier_mutex);
//将到达barrier的线程数加1
bstate.nthread++;
//当所有的线程都到达barrier时
if (bstate.nthread == nthread) {
//针对barrier_cond这个环境变量广播,表示激活所有线程以继续执行
pthread_cond_broadcast(&bstate.barrier_cond);
bstate.nthread = 0;
bstate.round++;
}
//否则进入sleep状态,并释放互斥锁
else {
pthread_cond_wait(&bstate.barrier_cond, &bstate.barrier_mutex);
}
pthread_mutex_unlock(&bstate.barrier_mutex);
return;
}

再次运行barrier.c,运行成功:

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章