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);
}