int main( int argc, char *argv[] ) { int i; void * status_temporary; // not really used anymore thr_init(STACK_SIZE); REPORT_START_CMPLT; /* handle options - number of mutexes , number of threads, "footprint" */ switch(argc) { case 4: footprint = atoi(argv[3]); /* fall through */ case 3: n_chasethreads = atoi(argv[2]); /* fall through */ case 2: n_mutexes = atoi(argv[1]); /* fall through */ default: break; } // the requirement for n_chasethreads is obscure but not entirely stupid // what we're trying to make sure is that there are some threads that // get 'caught behind' a 'yielder' thread under most normal scheduling // choices if ( (argc > 4) || (footprint < 1) || (n_chasethreads < (2 * STUPID_MAGIC_CONSTANT - 1)) || (n_mutexes < 3) || (n_mutexes <= footprint) ) { printf("Usage: %s [number of mutexes] [number of chase threads] " "[footprint]\n", argv[0]); printf("Number of mutexes must be at least 3 and strictly greater than " "footprint\n"); printf("Number of chasethreads must be at least (2 * " "STUPID_MAGIC_CONSTANT - 1) = %d\n", (2 * STUPID_MAGIC_CONSTANT - 1)); printf("Footprint (number of locks acquired at the same time) must be " "at least 1\n"); /* don't REPORT anything: abort, attract attention of TA */ exit(1); } thrgrp_init_group(&tg); mtxs = (mutex_t *)calloc(n_mutexes, sizeof(mutex_t)); for (i = 0; i < n_mutexes; i++) { assert(mutex_init(&(mtxs[i])) == 0); } for (i = 0; i < n_chasethreads; i++) { assert(thrgrp_create(&tg, chase, (void *)i) >= 0); } for (i = 0; i < n_chasethreads; i++) { assert(thrgrp_join(&tg, &status_temporary) == 0); } free(mtxs); REPORT_END_SUCCESS; exit(0); }
int main(int argc, char ** argv) { int error; int i; int retcode; thrgrp_group_t tg; try(thr_init(7*1024)); try(mutex_init(&worldLock)); try(mutex_init(&updateLock)); try(cond_init(&updates)); try(cond_init(&gameOver)); initScreen(); thrgrp_init_group(&tg); try(thrgrp_create(&tg,update, 0)); try(thrgrp_create(&tg,controlThread, 0)); try(thrgrp_create(&tg,targetThread, 0)); try(thrgrp_create(&tg,scoreThread, 0)); /** finish drawing the screen **/ //scheduleUpdate(); /** lock down until the game finishes **/ mutex_lock(&worldLock); cond_wait(&gameOver, &worldLock); mutex_unlock(&worldLock); /** game is over **/ cond_signal(&updates); /** Once the game is over, cleanup after yourself! **/ for(i=0; i<NUM_THREADS; i++) { try(thrgrp_join(&tg, (void **)&retcode)); printf("Worker thread returned with code %d.\n",retcode); } thr_exit(0); return 0; }
int main() { thr_init(4096); int ticks = get_ticks(); int i, answer, guess; thrgrp_group_t group; REPORT_ON_ERR(thrgrp_init_group(&group)); for (i = 0; i < THREADS; i++) { REPORT_ON_ERR(thrgrp_create(&group, (thr_func*) fib, (void*) FIBN)); } REPORT_ON_ERR(thrgrp_join(&group, (void*) &answer)); for (i = 1; i < THREADS; i++) { REPORT_ON_ERR(thrgrp_join(&group, (void*) &guess)); if (guess != answer) { REPORT_END_FAIL; } } printf("fib(%d) = %d\n", FIBN, answer); printf("ticks taken: %d\n", get_ticks() - ticks); return 0; }