作业地址

作业是通过条件变量实现 barrier,barrier 是任何已经完成的线程(进程)需要等待未完成线程(进程)的同步运行方式

主要修改 barrier() 这个函数,首次编译的时候出现下面 assertion failed

1
2
3
4
5
$ gcc -g -O2 -pthread barrier.c

$ ./a.out 2
a.out: barrier.c:42: thread: Assertion `i == t' failed.
[1]    1766 abort (core dumped)  ./a.out 2

关于条件变量可参考 条件变量 之 稀里糊涂的锁

根据题意进行修改

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
static void
barrier()
{
  // 对 barrier 加锁
  pthread_mutex_lock(&bstate.barrier_mutex);
  bstate.nthread++;
  // 所有线程到达 barrier
  if (bstate.nthread == nthread) {
    // 针对 barrier_cond 广播激活所有线程
    pthread_cond_broadcast(&bstate.barrier_cond);
    bstate.nthread = 0;
    bstate.round++;
  } else {
    // 不是所有线程到达 barrier 则释放互斥锁并等待
    pthread_cond_wait(&bstate.barrier_cond, &bstate.barrier_mutex);
  }
  // 对 barier 解锁
  pthread_mutex_unlock(&bstate.barrier_mutex);

  return ;
}

最后运行结果

1
2
3
4
$ gcc -g -O2 -pthread barrier.c

$ ./a.out 2
OK; passed