#include #include #include #include long int MAX; long int sum = 0; long int n_threads; pthread_mutex_t lock; void* somador(void *tid){ long int i, start, end, sum_local = 0; long int *id = (long int *) tid; start = *id * (MAX / n_threads); if(*id == n_threads - 1) end = MAX; else end = start + (MAX / n_threads); for(i = start; i < end; i++) sum_local++; printf("thread %ld - sum = %ld\n", *id, sum_local); pthread_mutex_lock(&lock); sum += sum_local; pthread_mutex_unlock(&lock); pthread_exit(NULL); } int main(int argc, char ** argv) { if(argc != 3){ fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } n_threads = atoi(argv[1]); MAX = atoi(argv[2]); long int tid; pthread_t *threads; struct timespec start, finish; double elapsed; threads = (pthread_t *) malloc(n_threads * sizeof(pthread_t)); pthread_mutex_init(&lock, NULL); clock_gettime(CLOCK_MONOTONIC, &start); for(tid = 0; tid < n_threads; tid++) pthread_create(&threads[tid], NULL, (void *) somador, (void *) &tid); for(tid = 0; tid < n_threads; tid++) pthread_join(threads[tid], NULL); pthread_mutex_destroy(&lock); clock_gettime(CLOCK_MONOTONIC, &finish); elapsed = (finish.tv_sec - start.tv_sec) + (finish.tv_nsec - start.tv_nsec) / 1000000000.0; printf("\nTotal time: %.10f seconds\n\n", elapsed); printf("sum global = %ld\n", sum); free(threads); pthread_exit(NULL); }