/* * compteurBOOM_v6_N_threads_MapReduce_local.c * * Version multithread implantant le patron de conception MapReduce, mais * travaillant sur des zones mémoire vraiment spécifique à chaque thread. */ #include #include #include #include #include #include #include #define FINAL_COUNTER 200000000 #define NB_THREAD 8 int counter = 0; void *start_routine(void *arg) { int my_local_counter = 0; int i; for (i = 0; i < FINAL_COUNTER / NB_THREAD; i++) { my_local_counter++; } pthread_exit((void*)(int64_t)my_local_counter); } int main (int argc, char *argv[]) { int rc; pthread_t thread[NB_THREAD]; assert(FINAL_COUNTER % NB_THREAD == 0); // Pour verifier que, si on repartit le travail d'incrementation de counter entre NB_THREAD, on est certain d'obtenir FINAL_COUNTER. // Map phase for (int i = 0; i < NB_THREAD; i++) { rc = pthread_create(&thread[i], NULL, start_routine, NULL); if (rc) error(EXIT_FAILURE, rc, "pthread_create"); } // Reduce phase for (int i = 0; i < NB_THREAD; i++) { void *retval; rc = pthread_join(thread[i], &retval); counter += (int64_t)retval; // Il est acceptable d'ajouter cette valeur sur 64 bits, car on est certain·e que le nombre stocke etait un int, donc un int32_t qui a ete caste en int64_t pour être range dans l'argument void* de pthread_exit. if (rc) error(EXIT_FAILURE, rc, "pthread_join"); } if (counter != FINAL_COUNTER) printf("BOOM! counter = %d\n", counter); else printf("OK counter = %d\n", counter); exit(EXIT_SUCCESS); }