Pthreads Program
// // Simple thread demo in plain C. The main declares a certain amount of // "resources" (just an integer number) then starts two threads which // "work through" the resources (mostly by printing that they did). This // uses the standard, and truely awful, pthreads interface. // #include <stdio.h> #include <stdlib.h> #include <time.h> #include <pthread.h> #include <unistd.h> #include <sys/types.h> /* Shared data. */ int depot; /* Synchronizer. */ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; /* Thread info structure. */ struct threadinfo { char *topr; /* What to print. */ int low, high; /* Random range. */ }; /* Thread function */ void * thbod(void *data) { struct threadinfo *tip = (struct threadinfo *)data; while(1) { /* Choose a random number in range. */ int amt = rand() % (tip->high - tip->low + 1) + tip->low; /* Acquire the lock and obtain needed resource. */ pthread_mutex_lock(&mutex); if(depot < amt) amt = depot; depot -= amt; pthread_mutex_unlock(&mutex); /* When the resource is exhausted, we're done. */ if(amt == 0) return; /* Do that much "work." */ while(amt--) { printf("[%s]", tip->topr); fflush(stdout); } printf("\n"); fflush(stdout); } } /* Main starts two threads and waits for them to end. */ main() { /* These are the descriptive data for each thread. */ struct threadinfo ti1 = { "Z", 14, 18 }; struct threadinfo ti2 = { "EE", 8, 12 }; /* Two threads. These are actually something like thread ids. */ pthread_t th1, th2; /* Seed the random number generator to vary behavior. */ srand(time(0) ^ 387*getpid()); /* Create the threads. Both start running thbod, and finish when the function returns. The depot provides resources for the the threads to run. */ depot = 3000; pthread_create(&th1, NULL, thbod, &ti1); pthread_create(&th2, NULL, thbod, &ti2); /* Wait for each of them to be done. */ pthread_join(th1, NULL); printf("First Done\n"); fflush(stdout); pthread_join(th2, NULL); printf("Second Done\n"); fflush(stdout); }