Example #1
0
 virtual ~MQ()
 {
     destroy_sem(&this->p_sem);
 };
Example #2
0
int main() {
	// allocate space for initial threads and thread data
    pthread_t initial_threads[ATOM_COUNT];
	thread_data_t thread_data[ATOM_COUNT];

	// seed random
	srand((unsigned)time(&t));

    // initialize the semaphores using predefined values for the sequential CH4 prod. problem
	// use helper function to initialize semaphores
	sem[S] = make_semaphore(S_VAL);
	sem[SH] = make_semaphore(SH_VAL);
	sem[SC] = make_semaphore(SC_VAL);

    // count number of carb and hydro atoms randomly spawned
	int carb_count = 0;
	int hydro_count = 0;

	// do random execution
	int i;
	int ret_code = 0;
	for (i = 0; i < ATOM_COUNT; i++) {
		// set thread id
		thread_data[i].tid = i;
		int val = rand();
		// spawn carbon atom when rand odd
		if (val % 2 != 0) {
			if ((ret_code = pthread_create(&initial_threads[i], NULL, carbon, &thread_data[i]))) {
			    fflush(stderr);
				fprintf(stderr, "error: C pthread_create, %d\n", ret_code);
				fflush(stderr);
			    return EXIT_FAILURE;
			}
			carb_count++;
		} else {
			// otherwise, spawn hydrogen atom when rand even
			if ((ret_code = pthread_create(&initial_threads[i], NULL, hydrogen, &thread_data[i]))) {
			    fflush(stderr);
				fprintf(stderr, "error: H pthread_create, %d\n", ret_code);
			    fflush(stderr);
				return EXIT_FAILURE;
			}
			hydro_count++;
		}
	}

	// determine number of carbon atoms already satisfied
	int num_carb_satisfied = hydro_count / 4;
	// determine hydrogen left over from previous spawn loop
	int hydro_left_over = hydro_count % 4;
	// determine number of carbon left to satisfy
	int num_carb_left = carb_count - num_carb_satisfied;
	// determine number of hydrogen needed to satisfy all carbons
	int num_hydro_left = (num_carb_left * 4) - hydro_left_over;

	// allocate more space for extra h threads and thread data
	pthread_t extra_h_threads[num_hydro_left];
	thread_data_t extra_thread_data[num_hydro_left];

	// compensate for mismatched spawning with extra hydrogen
	for (i = 0; i < num_hydro_left; i++) {
		fflush(stdout);
		printf("Spawning extra hydrogen...\n");
		fflush(stdout);
		// set thread id
		extra_thread_data[i].tid = i+ATOM_COUNT;

		// spawn hydrogen atom
		if ((ret_code = pthread_create(&extra_h_threads[i], NULL, hydrogen, &extra_thread_data[i]))) {
		    fflush(stderr);
			fprintf(stderr, "error: H pthread_create, %d\n", ret_code);
		    fflush(stderr);
			return EXIT_FAILURE;
		}
	}

	int total_atom_count = ATOM_COUNT + num_hydro_left;
	int j = 0;
    // wait for all atoms to be destroyed, even though science states that's impossible
    for (i = 0; i < total_atom_count; i++) {
    	fflush(stdout);
    	printf("Waiting for thread %d to exit...\n", i);
    	fflush(stdout);
    	// destroy initial threads
    	if (i < ATOM_COUNT){
    		if ((ret_code = pthread_join(initial_threads[i], NULL))) {
    			fflush(stderr);
    			fprintf(stderr, "error: initial pthread_join, id: %d, errcode: %d\n", i, ret_code);
    			fflush(stderr);
    		}
    	} else {
    		// destroy additional hydrogen threads
    		// adjust index for additional thread array
    		j = i - ATOM_COUNT;
			if ((ret_code = pthread_join(extra_h_threads[j], NULL))) {
				fflush(stderr);
				fprintf(stderr, "error: additional H pthread_join, id: %d, errcode: %d\n", j, ret_code);
				fflush(stderr);
			}
    	}
    }

    fflush(stdout);
    printf("Sequential CH4 making complete. Semaphores are being removed.\n");
    fflush(stdout);

    // destroy the semaphores and free memory
    destroy_sem(sem[S]);
    free(sem[S]);
    destroy_sem(sem[SC]);
    free(sem[SC]);
    destroy_sem(sem[SH]);
    free(sem[SH]);

    fflush(stdout);
    printf("Exiting sequential CH4 process...\n");
    fflush(stdout);

    return EXIT_SUCCESS;
}