/* thread5.c run 4 threads, three stops and start */ #include #include #include #include #define n_thread 4 #define np 5 static int nb = 0; static int results[n_thread]; static pthread_cond_t go; static pthread_mutex_t bar; void barrier(void) { printf("in barrier \n"); fflush(stdout); pthread_mutex_lock(&bar); nb++; printf("nb=%d of np=%d \n", nb, np); fflush(stdout); if(nb == np) { nb = 0; printf("about to broadcast \n"); fflush(stdout); pthread_cond_broadcast(&go); } else { printf("about to cond wait \n"); fflush(stdout); pthread_cond_wait(&go, &bar); } pthread_mutex_unlock(&bar); } /* end barrier */ void * thread_compute(void * threadID) { int i; i = (int)threadID; printf(" thread %d at first barrier \n", i); fflush(stdout); barrier(); printf(" thread %d running after first barrier\n", i); fflush(stdout); results[i] = 10*(i+1); /* done this far */ printf(" thread %d at second barrier \n", i); fflush(stdout); barrier(); printf(" thread %d running after second barrier\n", i); fflush(stdout); results[i] = 100*(i+1); /* done this far */ printf(" thread %d at third barrier \n", i); fflush(stdout); barrier(); printf(" thread %d running after third barrier \n", i); fflush(stdout); results[i] = 1000*(i+1); /* done */ printf(" thread %d at fourth barrier \n", i); fflush(stdout); barrier(); /* pthread_exit(NULL); */ return threadID; } int main(int argc, char * argv[]) { int rc, t; int errcode; int status; pthread_t threads[n_thread]; printf("pthread5.c running \n"); fflush(stdout); pthread_mutex_init(&bar, NULL); pthread_mutex_unlock(&bar); pthread_cond_init(&go, NULL); for(t=0; t