#include #include #include #include #include "prtastr.h" #define BUFFSIZE 1024 static pthread_mutex_t join_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t join_cond = PTHREAD_COND_INITIALIZER; static int delay = 0; static int nthreads = 0; void *join_thread_main(void *arg){ char buff[BUFFSIZE]; sprintf(buff,"I'm the spawned thread chug chug chugging along\n"); prtastr(buff, STDERR_FILENO, delay); pthread_mutex_lock(&join_mutex); fprintf(stderr, "thread signalling finished\n"); pthread_cond_signal(&join_cond); pthread_mutex_unlock(&join_mutex); pthread_exit(NULL); } int main(int argc, char *argv[]){ if((argc != 3) || ((nthreads = atoi(argv[1])) < 0) || ((delay = atoi(argv[2])) < 0)) { fprintf (stderr, "Usage: %s nthreads delay\n", argv[0]); exit(EXIT_FAILURE); } { int i; int threads_finished = 0; pthread_t join_threads[nthreads]; fprintf(stderr, "main thread spawning %d threads\n", nthreads); pthread_mutex_lock(&join_mutex); for(i = 0; i < nthreads; i++) if(pthread_create(&join_threads[i], NULL, join_thread_main, NULL) != 0){ perror("thread creation failed"); exit(EXIT_FAILURE); } fprintf(stderr, "main thread waiting after spawning %d threads\n", i); while(threads_finished < nthreads){ pthread_cond_wait(&join_cond, &join_mutex); threads_finished++; fprintf(stderr, "threads finished = %d\n", threads_finished); } fprintf(stderr, "main thread awoken\n"); exit(EXIT_SUCCESS); } }