#include #include #include #include int thread_delay; int parse_args(int argc, char *argv[ ], int* n){ if ( (argc != 2) || ((*n = atoi (argv[1])) < 0) ) { fprintf (stderr, "Usage: %s delay\n", argv[0]); return(-1); }; return(0); } void spin(){ int i; for(i = 0; i < thread_delay; i++); } void* increment_shared_counter(void *counter){ long* lp = (long *)counter; while(1){ (*lp)++; spin(); } } void* decrement_shared_counter(void *counter){ long* lp = (long *)counter; while(1){ (*lp)--; spin(); } } int main(int argc, char *argv[ ]){ long shared_counter = 0; pthread_t up, down; if(parse_args(argc,argv,&thread_delay) < 0) exit(0); if(0 != pthread_create(&up,NULL,increment_shared_counter,&shared_counter)){ fprintf(stderr, "Spawn of increment_shared_counter failed!\n"); exit(EXIT_FAILURE); } if(0 != pthread_create(&down,NULL,decrement_shared_counter,&shared_counter)){ fprintf(stderr, "Spawn of decrement_shared_counter failed!\n"); exit(EXIT_FAILURE); } while(1){ fprintf(stderr,"shared_counter = %ld\n", shared_counter); spin(); } exit(EXIT_SUCCESS); }