Exemplo n.º 1
0
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);
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
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;
}