return to first page linux journal archive
keywordscontents

Listing 1. Example Program

/* You can compile this program with:
 * gcc -Wall -D_REENTRANT -o thread thread.c<\n> 
 * -lpthread */
/* We always need to include this header file for<\n> 
 * the threads */
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
/* This is the prototype for our thread function */
void *mythread(void *data); 
/* We must initialize our mutex */
pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER;
/* This will be a shared variable between all of<\n> 
 * the threads */
int x = 0;
int main(void) {
   /* This will be an array holding the thread ids<\n> 
    * for each thread */
   /* We keep track of all the tids so that we can<\n> 
    * call pthread_join()later to retrieve
    * the return value from the thread */
   pthread_t tid[10]; 
   int i;
   /* We will now create the 10 threads. Each<\n> 
    * thread will increment x until x is 4000.
    * On our last argument ot pthread_create
    * we could have passed an argument to the
    * thread function */
   for(i=0; i<10; i++) {
      pthread_create(&tids[i], NULL, mythread, NULL);
   }
   /* We will now wait for each thread to<\n> 
    * terminate */
   for(i=0; i<10; i++) {
   /* This will block until the specified 
    * thread finishes execution. Our second
    * argument to pthread_join can be a pointer 
    * that will have the return value of the 
    * thread stored in it */
      pthread_join(tids[i], NULL);
      printf("Thread id %ld returned\n", tids[i]);
   }
   return(1);
}
   /* This is our actual thread function */
void *mythread(void *data) {
   while(x < 4000) {
      /* We will now try to lock the mutex. If 
       * another thread already has it locked, we 
       * block until it is available again. After 
       * you first run this program, you should 
       * comment out the lock/unlock lines in this
       * function so that you can see why you need 
       * mutexes. */
      pthread_mutex_lock(&count_mutex);
      x++;
      /* We will have it print out the thread ID 
       * and the value of X */
      printf("Thread ID%ld: X is now %d.\n", 
         pthread_self(), x);
      /* We will now release the mutex so that 
       * another thread gets the chance to run. */
      pthread_mutex_unlock(&count_mutex);
   }
   /* We can return a pointer. Whatever pointer
    * we return can later be retrieved using the
    * pthread_join function */
   pthread_exit(NULL);
}