#include #include #include #include typedef struct{ long lp; int delay; } params_t; 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 delay){ int i; for(i = 0; i < delay; i++); } void* increment_shared_counter(void *counter){ params_t p = *((params_t *)counter); while(1){ (p.lp)++; spin(p.delay); } } void* decrement_shared_counter(void *counter){ params_t p = *((params_t *)counter); while(1){ (p.lp)--; spin(p.delay); } } int main(int argc, char *argv[ ]){ pthread_t up, down; params_t params; params.lp = 0; if(parse_args(argc,argv,¶ms.delay) < 0) exit(EXIT_FAILURE); if(0 != pthread_create(&up,NULL,increment_shared_counter,¶ms)){ fprintf(stderr, "Spawn of increment_shared_counter failed!\n"); exit(EXIT_FAILURE); } if(0 != pthread_create(&down,NULL,decrement_shared_counter,¶ms)){ fprintf(stderr, "Spawn of decrement_shared_counter failed!\n"); exit(EXIT_FAILURE); } while(1){ fprintf(stderr,"shared_counter = %ld\n", params.lp); spin(params.delay); } exit(EXIT_SUCCESS); }