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