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