Blog

Posted 2011/09/14

Pthreads race condition

The commented out lines will prevent the race condition.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#define NTHREADS      100
#define LOOPS         10000
int sum = 0;
pthread_mutex_t sum_mutex;

void *do_work() {
  int i;
  //pthread_mutex_lock(&sum_mutex);
  for (i=0; i<LOOPS; i++)
    sum = sum + 1;
  //pthread_mutex_unlock(&sum_mutex);
  pthread_exit(NULL);
}

int main(int argc, char *argv[]) {
  int i;
  pthread_t threads[NTHREADS];
  pthread_attr_t attr;

  pthread_mutex_init(&sum_mutex, NULL);
  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
  for (i=0; i<NTHREADS; i++)
    pthread_create(&threads[i], &attr, &do_work, NULL);

  for (i=0; i<NTHREADS; i++)
    pthread_join(threads[i], NULL);

  printf ("Thread sum: %d\n", sum);

  sum=0;
  for (i=0;i<NTHREADS * LOOPS;i++)
    sum = sum + 1;
  printf("Check sum:  %d\n",sum);

  pthread_attr_destroy(&attr);
  pthread_mutex_destroy(&sum_mutex);
  pthread_exit(NULL);
}