/* add and subtract */

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

#define COUNT 100000

void add(void);
void subtract(void);

/* global variables (shared by all threads) */
int count = 0;
pthread_mutex_t mutex;

main() {
  pthread_t add_tid, sub_tid;

  pthread_mutex_init(&mutex, NULL);

  pthread_create(&add_tid, NULL, 
		 (void *) &add, NULL);

  pthread_create(&sub_tid, NULL,
		 (void *) &subtract, NULL);
  
  pthread_join(add_tid, NULL);
  pthread_join(sub_tid, NULL);

  pthread_mutex_destroy(&mutex);

  exit(0);

}

void add() {
  int i;

  printf("add\n");
  for (i=0; i<COUNT; i++) {
    pthread_mutex_lock(&mutex);
    count = count + 1;
    printf("%d\n", count);
    pthread_mutex_unlock(&mutex);
  }
}

void subtract() {
  int i;

  printf("subtract\n");
  for (i=0; i<COUNT; i++) {
    pthread_mutex_lock(&mutex);
    count = count - 1;
    printf("%d\n", count);
    pthread_mutex_unlock(&mutex);
  }
}
